mysql小结

数据库设计三大范式:

1.第一范式第一范式(1NF)用来确保每列的原子性,要求每列(或者每个属性值)都是不可再分的最小数据单元(也称为最小的原子单元)。
例如,客人住宿信息表 (姓名, 客人编号, 地址, 客房号, 客房描述, 客房类型, 客房状态, 床位数, 入住人数, 价格)。
其中,“地址”列还可以细分为国家、省、市、区等,甚至有的程序还把“姓名”列也拆分为“姓”和“名”等。如果业务需求中不需要拆分“地址”和“姓名”列,则该数据表符合第一范式
2.第二范式第二范式(2NF)在第一范式的基础上更进一层,要求表中的每列都和主键相关,即要求实体的唯一性。如果一个表满足第一范式,并且除了主键以外的其他列全部都依赖于该主键,那么该表满足第二范式。
客人住宿信息表中的数据主要用来描述客人住宿信息,所以该表主键为(客人编号,客房号):
“姓名”列、“地址”列➡“客人编号”列。
“客房描述”列、 “客房类型”列、“客房状态”列、“床位数”列、“入住人数”列、“价格”列➡“客房号”列。
其中,“➡”符号代表依赖。以上各列没有全部依赖于主键(客人编号,客房号),只是部分依赖于主键,不符合第二范式。
使用第二范式后,客人住宿信息表可以分解成以下两个表:
客人信息表(客人编号,姓名,地址,客房号,入住时间,结账日期,押金,总金额),主键为“客人编号”列,其他列都全部依赖于主键列。
客房信息表(客房号,客房描述,客房类型,客房状态,床位数,入住人数,价格),主键为“客房号”列,其他列都全部依赖于主键列。
3.第三范式第三范式(3NF)在第二范式的基础上更进一层,第三范式是确保每列都和主键列直接相关,而不是间接相关,即限制列的冗余性。如果一个关系满足第二范式,并且除了主键以外的其他列都依赖于主键列,列和列之间不存在相互依赖关系,则满足第三范式。

mysql事务的四大特性

1.原子性:不可分割的最小操作单位,要么同时成功,要么同时失败。
2.一致性:事务操作前后,数据总量不变
3.隔离性:多个事务之间相互独立。
4.持久性:当事物提交或回滚后,数据库会持久化的数据保存。

mysql隔离级别:

点击查看

mysql 锁机制

根据操作类型可以分为:
1.读锁:共享锁。对同一个数据,多个操作可以同时进行,互不干扰
2.写锁:互斥锁/排它锁。如果当前写操作没有执行完毕,则其他进程无法进行读操作、写操作
根据操作粒度/范围可以分为:
1.表锁:一次性会一整张表加锁。MyISAM存储引擎默认使用表锁,优点是开销小、加锁快、无死锁;但锁的粒度较大,容易发生锁冲突,并发低(容易发生脏读、幻读、不可重复读、丢失更新等并发问题)。表锁在使用时,会在执行(select)前,自动给表中所有数据加读锁;在执行更新操作(DML)前,自动给表中的所有数据加写锁
2.行锁:一次性对一条数据加锁,InnoDB存储引擎默认使用行锁,行锁的开销大、加锁慢并且容易造成死锁;但行锁的粒度较小,不易发生锁冲突,并发度高
3.页锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

死锁检查控制
  • innodb_deadlock_delect
    对于高并发的系统,当大量线程等待同一个锁时,死锁检测可能会导致性能的下降。此时,如果禁用死锁检测,而改为依靠参数 innodb_lock_wait_timeout 执行发生死锁时的事务回滚可能会更加高效

环境准备

在这里插入图片描述

事务A事务B
start transaction;
select *from t where id = 1 for share;(给该条记录加上共享锁)
start transaction;
delect from t were id = 1; (因为事务A已经占有了该数据的锁,此时这里不能进行删除,所以会进行等待)
delect from t were id = 1; (此时死锁已经形成,事务A正常运行)事务B的运行结果图在这里插入图片描述

mysql的sql优化注意点?

sql慢的原因:
1.关联的查询表太多
2.未建立索引、索引失效
3.sql的执行顺序。常规是小表驱动大表
4.服务器内存不够用了
前三点可以用expalin命令查看,第四点则可以通过性能调优进行调整
mysql中 explain 各个列代表什么意思?
explain的作用:
表的执行顺序
是否走索引

各个字段的解释:
id:执行顺序:id相同时执行顺序自上而下。id不同时id值越大的越先执行。id有相同又有不同的,先走值大的,值相同的自上而下顺序执行。
select_type:查询的类型
SIMPLE:普通查询,不包含子查询或者union
PRIMARY:主查询,子查询的最外层的查询
SUBQUERY:子查询
DERIVED:衍生,子查询标注了别名,临时表
UNION:第二个select出行在union之后,则被标记。
UNION RESULT:从union合并
table:表名
partitions列: 查询将匹配记录的分区。 对于非分区表,该值为 NULL
type列: 表示关联类型或访问类型。也就是MySQL决定如何查找表中的行。依次从最优到最差分别为:system > const > eq_ref > ref > range > index > all
possible_keys列:显示MySQL在查询时可能走的索引
key列:显示MySQL在查询时实际用到的索引
key_len列:MySQL在索引里使用的字节数,通过此列可以算出具体使用了索引中的那些列。索引最大长度为768字节,当长度过大时,MySQL会做一个类似最左前缀处理,将前半部分字符提取出做索引。当字段可以为null时,还需要1个字节去记录。
ref列: 此列显示key列记录的索引中,表查找值时使用到的列或常量。常见的有const、字段名
rows列: 此列是MySQL在查询中估计要读取的行数。注意这里不是结果集的行数
Extra列:一些额外信息。常见的重要值如下:
1)Using index:使用覆盖索引(如果select后面查询的字段都可以从这个索引的树中获取,不需要通过辅助索引树找到主键,再通过主键去主键索引树里获取其它字段值,这种情况一般可以说是用到了覆盖索引)。
2)Using where:使用 where 语句来处理结果,并且查询的列未被索引覆盖。
3)Using index condition:查询的列不完全被索引覆盖,where条件中是一个查询的范围。
4)Using temporary:MySQL需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的。
5)Using filesort:将使用外部排序而不是索引排序,数据较小时从内存排序,否则需要在磁盘完成排序。
6)Select tables optimized away:使用某些聚合函数(比如 max、min)来访问存在索引的某个字段时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值