文章目录
1、索引分类
- 物理存储方式 :
- 聚簇索引(Clustered Index):按照索引的顺序来存储数据的索引,一个表只能有一个聚簇索引。聚簇索引的数据存储和索引存储在一起。
- 非聚簇索引(Non-clustered Index):独立于数据的逻辑顺序而存在的索引,一个表可以有多个非聚簇索引。非聚簇索引的数据存储和索引存储分开。
- 唯一性
- 唯一索引(Unique Index):要求索引列的值在整个表中是唯一的,不允许有重复值。
- 非唯一索引:允许索引列的值重复出现。
- 索引方式
- B-Tree索引:基于B-Tree数据结构实现的索引,是最常见的索引类型,用于支持范围查询和排序。
- B+Tree索引:基于B+Tree数据结构实现的索引,相比B-Tree索引,更适合范围查询和顺序访问,常用于数据库系统。
- Hash索引:基于哈希算法实现的索引,适用于等值查询。
- 索引对象
- 主键索引(Primary Key Index):用于标识表中的唯一记录,每个表只能有一个主键索引。
- 外键索引(Foreign Key Index):用于建立表与表之间关系的索引。
- 辅助索引(Secondary Index):除了主键索引之外的其他索引。
- 组合索引(Composite Index):包含多个列的联合索引,通过同时索引多个列可以提高特定查询的性能。
2、索引会加快查询
传统的查询方法,是按照表的顺序遍历的,不论查询几条数据,MySQL需要将表的数据从头到尾遍历一遍。
添加索引之后,MySQL一般通过 BTREE 算法生成一个索引文件,在查询数据库时,找到索引文件进行遍历,在比较小的索引数据里查找,然后映射到对应的数据,能大幅提升查找的效率。
和通过书的目录,去查找对应的内容,一样的道理。
3、创建索的注意点
索引虽然是sql性能优化的利器,但是索引的维护也是需要成本的。
- 将索引建在频繁查询的字段上:在经常用于 WHERE 条件判断、ORDER BY 排序和 JOIN 的字段上创建索引,可以提升查询性能。
- 控制索引的数量:索引需要占用存储空间,并在更新时需要进行索引维护操作,因此应适量创建索引,不要过多。
- 避免对低区分度字段创建索引:对于离散度较低的字段,如性别,创建索引可能带来的扫描行数减少有限,不建议创建索引。
- 避免将频繁更新的字段作为主键或索引:维护索引文件需要成本,并可能导致页分裂和增加 I/O 操作次数,不建议将频繁更新的字段作为主键或索引。
- 组合索引中将区分度高的值放在前面:为了满足最左前缀匹配原则,应该将区分度高的值放在组合索引的前面。
- 创建组合索引而不是修改单列索引:对于经常使用多个条件查询的情况,创建组合索引可以替代多个单列索引,提高查询性能。
- 对于过长的字段,考虑使用前缀索引:当字段值较长时,创建完整索引会消耗大量空间并导致较慢的搜索速度,可以考虑使用前缀索引,只索引字段的前几个字符。
- 不建议使用无序的值(如身份证号码、UUID)作为索引:当主键具有不确定性时,容易导致叶子节点频繁分裂,造成磁盘存储的碎片化,不建议将无序的值作为索引。
4、索引失效
- 查询条件包含 OR 操作符:当查询条件中使用 OR 操作