MySQL索引分析
MySQL索引
搞懂覆盖索引和聚簇索引
搞懂 不可重复读和幻读
MVCC多版本并发控制
MySQL事务隔离级别
MySQL优化
解决高并发事务:https://developer.aliyun.com/article/889128#slide-9
https://segmentfault.com/a/1190000012626590
实践:https://www.cnblogs.com/crazymakercircle/p/14846136.html
https://learnku.com/articles/65314
索引方法(BTREE,FULLTEXT,HASH,RTREE)
索引:1.B树索引
2.hash索引
3.FullText 全文索引
4.Spatial 空间索引
聚集索引
覆盖索引 叶子节点存放了数据行,加快了数据读取效率
最左前缀原则:(如果查询的时候查询条件精确匹配索引的左边连续一列或几列)
order by使用索引最左前缀
- order by a
- order by a,b
- order by a,b,c
- order by a desc, b desc, c desc
如果where使用索引的最左前缀定义为常量,则order by能使用索引
- where a=const order by b,c
- where a=const and b=const order by c
- where a=const and b > const order by b,c
不能使用索引进行排序
- order by a , b desc ,c desc --排序不一致
- where d=const order by b,c --a丢失
- where a=const order by c --b丢失
- where a=const order by b,d --d不是索引的一部分
- where a in(...) order by b,c --a属于范围查询
回表:
不走索引:like '%query_name%' ,
where端使用or条件连接,
where端使用函数等,
在group by和order by使用的时候要注意组合索引的最左前缀原则
外键 :
不设置外键的原因:
explain
慢日志
主从配置
数据库事务隔离级别
读取未提交 出现脏读 设置读取已提交事务隔离
读取已提交 出现不可重复读 设置可重读事务隔离
可重读 出现幻读 设置mvcc解决
串行化
脏读:事务B读取了事务A尚未提交的数据
不可重复读:事务B读取了事务A修改过一行的数据,造成事务B并发读取数据不一致 针对update操作
幻读: 事务A并发读取范围内的数据,事务B在该范围内插入新数据,事务A在次读取结果不一样,针对insert和delete操作
不可重复读和幻读到底有什么区别呢?
(1) 不可重复读是读取了其他事务更改的数据,针对update操作
解决:使用行级锁,锁定该行,事务A多次读取操作完成后才释放该锁,这个时候才允许其他事务更改刚才的数据。
(2) 幻读是读取了其他事务新增的数据,针对insert和delete操作
解决:使用表级锁,锁定整张表,事务A多次读取数据总量之后才释放该锁,这个时候才允许其他事务新增数据。
这时候再理解事务隔离级别就简单多了呢。
悲观锁和乐观锁
悲观锁
正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处 于锁定状态。
悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机 制,也无法保证外部系统不会修改数据)。
在悲观锁的情况下,为了保证事务的隔离性,就需要一致性锁定读。读取数据时给加锁,其它事务无法修改这些数据。修改删除数据时也要加锁,其它事务无法读取这些数据。
乐观锁
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。
而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( Version )记录机制实现。
何谓数据版本(mvcc)?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。
此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如 果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
网友评论