1、mysql分页有什么优化
https://blog.csdn.net/zzp448561636/article/details/68952861
2、悲观锁、乐观锁
悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想。行锁,表锁,排他锁,共享锁等是数据库的锁机制
悲观锁:获取锁之后再执行操作,提交事务后释放锁,实现上使用数据库提供的锁机制适合资源竞争比较激烈,或者锁代价小于回滚代价的场景
乐观锁:在事务提交的时候检查原有数据是否发生修改,有冲突则回滚当前事务。相对于悲观锁,在对数据库进行处理的时候,乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本或者时间戳
3、组合索引,最左原则
单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。不要试图分别基于单个列建立多个单列索引(因为虽然有多个单列索引,但是MySQL只能用到其中的那个它认为似乎最有效率的单列索引),但是有一个index_merge优化,where条件是多个索引,但是又不存在这些索引组成的组合索引,索引归并,可以求交集(and),也可以求并集(or)
组合索引:即一个索包含多个列
最左原则:使用到组合索引,查询条件必须从索引字段的左侧开始包含。
例如组合索引为(a,b,c),查找条件为a,ab,abc,ac都可以使用到索引,其中abc完全使用到索引,a,ab,ac只使用到部分索引,即a的部分。bc无法使用到索引
刚开始以为组合索引的B+树形式是,先按照a构建几层索引,在按照b构建下面几层索引,在按照c构建最底下的几层索引。abc字段在构建索引树的时候全部都用上,最终到达叶子节点。
但是看到几篇博客,说是只按照a构建索引树,然后叶子节点上对abc的组合字段进行排序存储
两种说法其实都可以解释最左原则,上文说的几篇博客的博主也不是很确定,希望有大神指导可以指点一下
附上博客地址:
https://blog.csdn.net/weixin_30531261/article/details/79329722
https://blog.csdn.net/klchht/article/details/78146443?locationNum=9&fps=1
http://blog.codinglabs.org/articles/theory-of-mysql-index.html
然后在知乎上,看到一个另外的解释,组合索引是将多个列合并成一个索引值,比如a-b-c,然后定义一个排序方式,然后对合并的索引值进行和单列索引一样的索引树构建。比如1-a-l,1-b-l,2-a-c,4-d-j。这样子解释也可以解释上面的最左原则。
目前来看,我倾向于第三种存储结构
mysql复合索引的底层数据结构? - NYLON的回答 - 知乎
https://www.zhihu.com/question/268703288/answer/518296096
通过explain测试,如果存在a,b的单索引,abc组合索引,在实际情况中,where条件是ab的情况,有时候会走单索引,根据explain的结果,row的数值是一致的,可能在选择索引的时候还会参考数据库的数据量
4、mysql 的表锁、行锁
MySQL InnoDB锁介绍及不同SQL语句分别加什么样的锁
以下所说的都是锁定读或DML(INSERT/UPDATE/DELETE)语句的情形,且索引顺序是递增的:
- RC级别只有行锁,没有间隙锁,next-key lock。只在满足where条件的行上加锁;其余事务新插入的满足where条件的行不会加锁
- RR级别下, 间隙锁默认开启。 唯一索引上做等值查找是行锁;
- RR级别下:唯一索引上做范围查找:id>=7 and id<=40。如果没有满足边界值的记录则要往前/往后找到第一条不满足结果的值作为gap锁的范围下限。举例:对于gap的下限来说,如果存在id=7的数据,则gap锁的下限为[7,如果不存在id=7的记录,假设第一条不满足的记录为id=4,则gap锁的下限为(4,范围条件中的=影响存在记录时候是取开/闭区间。对于gap锁的上限来说:如果存在id=40的记录,则gap锁的上限为,40],如果不存在则找到下一条不满足条件的记录,假如为id=45,则gap锁的上限为 ,45),同样=只影响存在记录时候是取开/闭区间。
- RR级别下非唯一索引做等值查找:除了对应记录的唯一索引的行锁,还包含往后一个非唯一索引记录的闭区间的gap lock。举例:user_id =40,除了user_id=40的行锁,假设后面一条记录的user_id=45,则gap lock的范围是[40,45]
- RR级别下非唯一索引做区间查找:我自己测试下来感觉所有范围都被锁住了,和自己的直觉有点不对头,存疑
- RR级别下在非索引字段上做查找是所有行加行锁
- RR级别下,当另一个事物插入数据时候,会生成插入意向锁,看这个锁是否和其他事物的gap锁行锁冲突,冲突就会阻塞
5、mysql 性能优化
建立索引,join操作的字段建立索引,垂直分表,读写分离,explain查看执行过程优化查询sql,拆分大批量的insert和delete语句
https://juejin.im/post/59d83f1651882545eb54fc7e
https://coolshell.cn/articles/1846.html
6、mysql的索引分类:B+,hash;什么情况用什么索引
hash索引:哈希索引数据并不是按照索引值顺序存储的,索引也就无法用于排序。哈希索引也不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。
https://my.oschina.net/xinxingegeya/blog/308383
https://my.oschina.net/xinxingegeya/blog/308484
https://blog.csdn.net/u012758088/article/details/77113122
7、事务的特性和隔离级别
ACID:原子性,一致性(相关数据的修改要符合数据规则,保持一致性),隔离性(其他事务不能对正在修改数据做操作),持久性
隔离级别是通过MVCC进行控制,只控制读操作,不控制写操作。RR级别下的版本控制是在第一个select操作的时候创建一个快照,所以能保证每次读到相同的数据。关于此二者的实验说明,可以参考文章不可重复读及幻读区别内部有实例,说明,参考文章