为什么要使用索引(面试题)
- 因为索引能够让我们避免全表扫描去查找数据,提升检索效率
什么样的信息能成为索引(面试题)
- 主键、唯一键等只要是能让数据具备一定区分性的字段都能成为索引
索引的数据结构(面试题)
主流是B+树,还有哈希结构,BitMap等
密集索引和稀疏索引的区别(面试题)
- 密集索引文件中的每个搜索码值都对应一个索引值
- 稀疏索引文件只为索引码的某些值建立索引项
索引是建立得越多越好吗
- 数据量小的表不需要建立索引,建立会增加额外的索引开销
- 数据变更需要维护索引,因此更多的索引意味着更多的维护成本
- 更多的索引意味着需要更多的空间
Hash索引的缺点
- 仅仅能满足“=”,“IN”,不能使用范围查询
- 无法被用来避免数据的排序操作
- 不能利用部分索引键查询
- 不能避免表扫描
- 遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高(可能会变成线性)
如何定位并优化慢查询Sql
需要具体场景具体分析,大致思路如下:
- 根据慢日志定位慢查询sql
- 使用explain等工具分析sql
- 修改sql或者尽量让sql走索引
额外知识
- 若一个主键被定义,该主键则作为密集索引
- 若没有主键被定义,该表的第一个唯一非空索引则作为密集索引
- 若不满足以上条件,innodb内部会生成一个隐藏主键(密集索引)
- 非主键索引存储相关键位和其对应的主键值,包含两次查找