MySQL中的回表是什么
- 回表是指在使用二级索引作为条件进行查询时,由于二级索引中只存储了索引字段的值和对应的主键值,无法得到其他数据。如果要查询数据行中的其他数据,需要根据主键去聚簇索引查找实际的数据行,这就叫回表。
- 不仅仅是多查一次,还会带来随机IO,随机IO比顺序IO慢
- 因此,不要因为图方便在代码里都使用select*,从而引发不必要的回表操作。
MySQL中使用索引一定有效吗?如何排查索引效果?
- 索引不一定有效。对于一些小表,全表扫描的开销可能更小。是否用上索引是根据MySQL成本计算决定的。
- 排查索引效果的方法:通过使用
EXPLAIN
命令,了解是否使用了索引,使用了哪个索引,估算的行数等信息。
EXPLAIN
主要观察以下几点:
- type:range,index——索引,ALL——全表
- key:显示索引的名称——索引,null——没有使用
- rows:评估扫描量来判断
索引失效的条件和对索引的进一步认识
- MySQL索引内容实在有点多,详见这篇文章吧
MySQL的查询优化器如何选择执行计划
- 将sql语句解析为解析树。
- 预处理,包括语法检查,权限验证,查询重写(编译原理那一套)
- 生成多个执行计划,并选择成本最低的执行计划
RabbitMQ怎么实现延迟队列
- RabbitMQ 怎么实现延迟队列? - Java 热门面试题 200 道 - 面试鸭 - 程序员求职面试刷题神器
重在理解
MySQL中的索引数量是否越多越好?
- 并不是,因为索引无论时间还是空间上都有一定成本
- 时间上:索引越多改表时需要修改的地方也就越多,时间开销就大了。
- 空间上:每建立一个二级索引,都需要新建一个B+树
建索引的注意事项:
- 索引并不是越多越好
- 对于字段的值大量重复的不要建立索引,意义不大还占空间
- 长字段不应该建立索引,因为扫描时加载至内存不仅耗时还会抢占别的缓存数据
- 修改频率远大于查询频率时
- 需要频繁查询的,可以考虑联合索引
- 对经常在order by,group by,distinct后面的字段建立索引,索引可以帮助加快这些操作的速度