每日mysql
Mysql中使用索引一定有效吗?如何排查索引效果。
索引不一定有效;
当索引字段的基数过小的时候,查询条件不包含索引或者查询条件与索引的顺序不匹配的时候(不满足最左前缀匹配原则)。小表的索引查询也不一定生效,因为全表查询的效率可能高于索引查询,具体是否生效需要mysql计算成本之后确定。
排查索引效果可以使用expain命令,查看sql的执行计划,关注type,key,rows属性,type是访问类型,为all的时候为全表扫描。
key属性是被使用的索引,为null说明没有使用索引,rows属性是遍历的行的数量。可以评估sql的查询效率。
Mysql中的事务隔离级别有哪些
隔离级别由低到高为
读未提交:一个事务可以读取另一个事务未提交的数据,当另一个事务发生回滚的时候,产生前后数据不一致也就是我们说的脏读现象
读已提交(部分大厂隔离级别):一个事务可以读取另一个事务已提交的数据,而当另一个事务对数据产生更新的时候。会导致在事务中俩次读取的数据不一致。这就是不可重复读。
可重复读(mysql默认的隔离级别):这个级别确认一个事务中每一次读取的返回结果都是一致的,避免了不可重复渎,但是可能产生幻读。
串行化:当一个事务提交后才会开始下一个事务,避免了幻读的情况。但是没有了并发性,效率低。安全性高。
Mysql中的索引数量是否越多越好
索引不是越多越好,因为索引需要空间成本和时间成本。
时间成本方面:当数据发生更新,插入删除等操作的时候,索引也要更新,索引越多更新的越多,时间成本越多。
空间成本方面:一个索引就对应一棵b+树,索引越多,b+树越多,占用的空间越多,空间成本越大。
数据库的脏读,不可重复读,幻读分别是什么
脏读发生在读未提交这个级别,当一个事务读取到另一个事务未提交的数据的时候,这个数据发生了回滚,会导致第一次读取的数据不一致,这就是脏读。
不可重复渎发生在读已提交这个级别,在一个事务查询数据后,另一个事务已经提交了的修改的时候,这个事务再一次读取到的数据就是修改后的数据,在同一个事务中多次读取的数据可能不一致。这就是不可重复读。
幻读发生在可重复读这个级别,在一个事务中多次查询返回的数据行的数量可能不一致,这就是幻读。
Mysql的查询优化器如何选择执行计划
首先把sql解析为解析树,如何进行预处理,然后计算其cpu成本和io成本,最后选择总成本最小的索引。
Mysql的默认事务隔离级别是什么,为什么选择这个级别
Mysql的默认隔离级别是可重复读。为了解决早期binlog只支持statement格式的而导致的主从数据不一致的问题。虽然mysql5.1之后支持row格式,但是可重复读这个级别在性能和安全性上算比较平衡,因此还是这个级别。
为什么大厂一般使用RC(读已提交)
提升并发,减少死锁。
count(1) ,count(*), count(字段名)有什么区别
count(1)和count(*) 没有区别,都是统计表中的数据条数,null也统计。
count(字段名) 统计该字段不为空的数据条数。
推荐八股文学习网站(要会员,但是真的很值!终身会员!):
https://www.mianshiya.com/?shareCode=s4stlv