Mysql知识点整理
Posted ws-zhuli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql知识点整理相关的知识,希望对你有一定的参考价值。
1、存储引擎区别
MyISAM:不支持事物、仅支持表级锁、支持B+树索引
MEMORY:不支持事物、仅支持表级锁、支持B+树和HASH索引
InnoDB:支持事物、支持行级锁、支持B+树索引
2、锁机制
MyISAM、MEMORY存储引擎使用的是表级锁,分别为表共享读锁和表独占写锁,显示加锁LOCK TABLE,
InnoDB存储引擎即支持行级锁也支持表级锁,默认采用是行级锁,分别为共享锁和排他锁,显示加锁用lock in share mode 显式的加共享锁,用 for update 显式的加排他锁,InonoDB的存储引擎在使用INSERT、DELETE、UPDATE操作使默认使用排他锁,在使用SELECT不会加任何的锁
InnoDB锁机制的重点在于行级锁的实现方式是——索引加锁
1、只有通过索引检索数据时才会触发行级锁,否则使用表级锁
2、即使是访问不同行的数据,如果使用的相同的索引键,会发生锁冲突
3、如果数据表建有多个索引时,可以通过不同的索引锁定不同的行
select * from user where id > 100 for updata,例如显示加排他锁
区别:
行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
表级锁: 开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);锁定粒度大,发生锁冲突的概率最高,并发度最低。
综上:行级锁使用在高并发环境下,对事物完整性要求较高的系统,而表级锁适用于并发不高,以多查询,少更新的系统
3、索引 InnoDB默认支持B+树
mysql索引也称为"键",索引优化是对查询性能优化的最有效的手段了。索引的数据结构B+树,索引的功能就是加速查找功能
B+树数据结构的性质
(1)、索引字段要尽量小
(2)、索引的最左匹配原则,
MYSQL索引分类
(1)普通索引 index 加速查找 (2)唯一索引 unique 唯一约束+加速查找(3)主键唯一索引 primary key 不为空且唯一+加速查找(4)联合索引 (column1,column2)
注意索引无法命中情况
(1)‘>’、‘<’在主键列或者整数列会走索引,其他情况不走索引
‘like‘、‘between‘
‘or’的条件中列没有加索引不会走索引,
‘!=’普通索引不走索引,主键索引走索引
(2)索引列使用函数
4、乐观锁:在更新金额或者状态的时候包含原值信息,这并不是数据的锁,而是利用了数据比较抽象出来的锁,例如:update xx set amount=${amount} where id=“${id}” and amount=${origAmount}
悲观锁:数据库的行级锁,因为行级锁的颗粒度小,需要的系统开销大,可能会出现死锁的情况,所以称为悲观锁。在操作DML(insert,update,delete)时oracle和mysql会自动加上行级锁,显式的for update也是加上行级锁
redis分布式锁:使用已有组件redisOneBuOne
select * from table for update 【of column】【nowait|wait 3】for update nowait 第二个执行遇锁时直接抛异常 for update wait 5 第二个执行遇锁时等待5s时间
注意:使用悲观锁时,如果是多表关联查询,例如:select * from t1,t2 where t1.id = t2.id and t1.age = ‘20‘ for update;就会把T1和T2两个表中符合条件的行锁定;此时,我们需要使用for update of column_name
例如:select * from t1,t2 where t1.id = t2.id and t1.age = ‘20‘ for update of t1.id;这样就会只把T1表中的符合条件的行加锁,T2表中符合条件的行不会加锁。
5、根据设置数据库不同的隔离级别,在不同的隔离级别下可能发生的不同问题
更新丢失、脏读(update)、幻读(insert)、不可重复读
MySQL 8 改变了之前的密码验证插件,导致现在去连接的话,出现了错误 mysql 8.0 默认使用 caching_sha2_password 身份验证机制 —— 从原来的 mysql_native_password 更改为 caching_sha2_password
ALTER USER ‘root‘@‘localhost‘ IDENTIFIED BY ‘password‘ PASSWORD EXPIRE NEVER; #修改加密规则
ALTER USER ‘root‘@‘localhost‘ IDENTIFIED WITH mysql_native_password BY ‘password‘; #更新一下用户的密码
FLUSH PRIVILEGES; #刷新权限
MYSQL多表关联查询命中索引的注意事项(sql优化)
1、ON 关联的字段必须要加索引(加快关联查询的速度)
2、explain关键字 显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
(1)selec_type:查询类型,常见的值[SIMPLE:简单表,不使用表连接或子查询。PRIMARY : 主查询,外层的查询。UNION 第二个或者后面的查询语句。SUBQUERY : 子查询中的第一个select]
(2)table:输出结果的表
(3)type: 从左到右,性能由最差到最好
3.1 type=ALL 全表扫描,
3.2 type=index 索引全扫描,遍历整个索引来查询匹配的行
3.3 type=range 索引范围扫描,常见于 <,<=,>,>=,between,in等操作符。
3.4 type=ref 使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的记录行。ref还经常出现在JOIN操作中
3.5 type=eq_ref 类似于ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中有一条记录匹配;简单来说,说是多表连接中使用 主建或唯一健作为关联条件
3.6 type=const/system 单表中最多有一个匹配行。主要用于比较primary key [主键索引]或者unique[唯一]索引,因为数据都是唯一的,所以性能最优。条件使用=。
3.7 type=NULL 不用访问表或者索引,直接就能够得到结果
(4)possible_keys:可能使用的索引
(5)Key:实际使用的索引
(6)key_len:索引使用的字节数
(7)ref:关联过程中匹配使用到的列或常量
(8)rows:表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
(9)Extra:
Using where:列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤
Using temporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询
Using filesort:MySQL中无法利用索引完成的排序操作称为“文件排序”
Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。
Impossible where:这个值强调了where语句会导致没有符合条件的行。
Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行
3、无效索引:对于数据变化不大的列,如XX类型,不应该使用索引,因为insert、update、delete操作都需要更新序列,区分度不大,索引效果不明显
4、运算符<,>,!=不走索引,OR两边的条件都需要是索引列否则也不走索引,如果出现OR的一个条件没有索引时,建议使用 union
5、ON后面跟查询条件是先进行删选再进行关联得出查询结果,ON ...WHERE 后面跟查询条件是先通过ON关联出临时表,再通过WHERE后面的条件删选出结果
以上是关于Mysql知识点整理的主要内容,如果未能解决你的问题,请参考以下文章