最近对mysql的基础知识很感兴趣,所以希望通过查询网络上的面试题来巩固下基础,所以如下
1 普通索引跟唯一索引应该如何选择
在 MySQL(InnoDB)里,"普通二级索引(KEY)"和"唯一索引(UNIQUE KEY)"在存储结构、查询性能上几乎一模一样,真正的差异只有三点:
- 唯一索引多一道"唯一性约束"检查
- 唯一索引对优化器的基数估计更准,某些场景能拿到更优的执行计划
- 唯一索引不能存重复值,因此插入/更新时可能多一次"冲突检测"往返
-
查询
- 当普通索引为条件时查询到数据会一直扫描,直到扫完整张表
- 当唯一索引为查询条件时,查到该数据会直接返回,不会继续扫表
-
更新
- 普通索引会直接将操作更新到 change buffer 中,然后结束
- 唯一索引需要判断数据是否冲突
所以**「唯一索引更加适合查询的场景,普通索引更适合插入的场景」**
2 一条sql命令一直查询慢的原因是什么
「1.没有用到索引」
- 比如函数导致的索引失效,或者本身就没有加索引
「2.表数据量太大」
- 考虑分库分表吧
「3.优化器选错了索引」
- 「考虑使用」 force index 强制走索引