索引
索引可以说是MySQL面试中的重中之重,一定要彻底拿下。
27.能简单说一下索引的分类吗?
从三个不同维度对索引分类:

索引分类
例如从基本使用使用的角度来讲:
- 主键索引: InnoDB主键是默认的索引,数据列不允许重复,不允许为NULL,一个表只能有一个主键。
- 唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
- 普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
- 组合索引:多列值组成一个索引,用于组合搜索,效率大于索引合并
28.为什么使用索引会加快查询?
传统的查询方法,是按照表的顺序遍历的,不论查询几条数据,MySQL需要将表的数据从头到尾遍历一遍。
在我们添加完索引之后,MySQL一般通过BTREE算法生成一个索引文件,在查询数据库时,找到索引文件进行遍历,在比较小的索引数据里查找,然后映射到对应的数据,能大幅提升查找的效率。
和我们通过书的目录,去查找对应的内容,一样的道理。

索引加快查询远离
29.创建索引有哪些注意点?
索引虽然是sql性能优化的利器,但是索引的维护也是需要成本的,所以创建索引,也要注意:
- 索引应该建在查询应用频繁的字段在用于 where 判断、 order 排序和 join 的(on)字段上创建索引。
- 索引的个数应该适量索引需要占用空间;更新时候也需要维护。
- 区分度低的字段,例如性别,不要建索引。离散度太低的字段,扫描的行数降低的有限。
- 频繁更新的值,不要作为主键或者索引维护索引文件需要成本;还会导致页分裂,IO次数增多。
- 组合索引把散列性高(区分度高)的值放在前面为了满足最左前缀匹配原则
- 创建组合索引,而不是修改单列索引。组合索引代替多个单列索引(对于单列索引,MySQL基本只能使用一个索引,所以经常使用多个条件查询时更适合使用组合索引)
- 过长的字段,使用前缀索引。当字段值比较长的时候,建立索引会消耗很多的空间,搜索起来也会很慢。我们可以通过截取字段的前面一部分内容建立索引,这个就叫前缀索引。