前言
这是一篇关于索引的文档。
首先要明白索引是 mysql 最重要的一篇之一。
因为这和数据库的性能息息相关。
本篇文章主要介绍数据库索引比较基本的内容
这篇文章以 mysql-5.7.38 的 innodb 引擎为例。
更新于--2022-6-8
一、索引基本功能
本文围绕 mysql 的 innodb 引擎讲解。
索引对性能的影响非常关键。一个好的索引能轻易的将查询性能提升几个量级。
但是不是所有的表字段建立索引都适合创建索引。如果在一个表的所有字段全部创建索引这样不如不使用索引。
当数据量较小时索引体现不出优势,但是在数据超过一定量级后,不恰当的索引和好的索引性能之间会是天差地别。
二、索引优缺点
本文围绕 mysql 的 innodb 引擎讲解。
mysql 索引字面意思理解起来非常简单。可以把它想象成一本字典的索引页。通过索引可以快速锁定到指定的页面。
索引作用
了解优缺点之前首先要知道索引的作用
索引可以提高查询速度,部分索引可以约束数据例如:主键索引,和唯一索引。
ORDER BY && GROUP BY 也能通过索引快速排序分组。
索引优点:
- 减少了服务器检索的数据量,提高查询速度。
--主要用途
- 提高表与表之间的连接的速度。
- 唯一索引可以约束数据的唯一性。
- 减少 ORDER BY && GROUP BY 排序和分组时间,提高效率。
索引缺点:
- 索引存储需要占用磁盘空间。
--并不是每一个字段都适合创建索引,下文会有讲解
- 需要额外时间对索引进行创建和维护。
- 增、删、改需要动态维护索引。降低维护速度。
--向有索引的表中插入记录时,数据库系统会按照索引进行排序,这样就降低了插入记录的速度
三、索引分类
本文围绕 mysql 的 innodb 引擎讲解。
索引整体分为三种类型
-
主键索引
--聚集索引
主键索引:它不仅有主键,而且有主键所属的全部数据,所以在 Innodb 中,主键索引即数据。
-
普通索引
--普通索引又可以分为 单列索引 && 唯一索引 两种
单列索引:指在一列数据创建索引,允许快速查找具有相应列值的行(值可以重复,并为空)。 唯一索引:在单列索引的基础上多一个唯一的特性(值不能重复,同时不能为空)。
-
复合索引(多列索引)
--最左匹配原则
最左匹配原则: 最左匹配原则以最左边的为起点任何连续的索引都能匹配上。 同时遇到范围查询(>、<、between、like)就会停止匹配。
现有一个复合索引如下
//创建索引
index user_key(name,age,sex)`
//在创建复合索引的同时也会创建两个索引(相当于同时创建了一个单列索引和两个聚合索引)
index name && index (name,age)
//但是 index age && index sex 不会被创建,因为这样违背了最左匹配原则
因为 innodb 底层是 B+ 树,所以 普通索引 && 复合索引 取值方式是一样的
列值为 Key,主键位置为 Value 即 (列值, 主键位置) 的非主键索引。
四、索引的建立
本文围绕 mysql 的 innodb 引擎讲解。
-
普通索引
具体的建立应该根据业务来看,通常情况下索引应该建立在值重复度比较低的列上。 一般情况下唯一索引的效率是除主键索引外最快的。
-
复合索引
复合索引创建需要考虑最左匹配原则的情况下创建。 复合索引在范围匹配的字段时会导致范围索引右边的索引失效。 //例: 现有索引 index user_key(name,age,sex) //查询: SELECT * FROM table WHERE name='张三' AND age BETWEEN 10 AND 20 AND sex = '男'; //这个查询语句 name && age 两个索引生效因为 BETWEEN 是一个范围查询 会导致 sex 索引 失效 //所以在创建这个复合索引时同时结合业务需求对 age 进行范围查询要改变复合索引创建顺序 //创建索引: index user_key(name,sex,age) //查询: SELECT * FROM table WHERE name='张三' AND age BETWEEN 10 AND 20 AND sex = '男'; 因为 mysql 有 sql 语句优化器所以这个查询通过优化器重新调整后等于 SELECT * FROM table WHERE name='张三' AND sex = '男' AND age BETWEEN 10 AND 20; 可以用 explain 在 mysql 中查看
五、索引失效
本文围绕 mysql 的 innodb 引擎讲解。
索引失效的几种情况
- 不等于(<>)导致索引失效
- is not null 无法使用索引(is null可以使用索引)
- LIKE 以 % 开头并且以 % 结尾无法使用索引
- OR 前后只要存在非索引的列,都会导致索引失效
- 字符编码集转换会导致索引失效
- WHERE字句中计算会导致索引失效
- 复合索引违反最左匹配原则索引会失效
总结
本文介绍了 mysql 索引的使用。
本文只有概念没有代码。
这篇文章覆盖了我在设计索引时分析的一些点,以后有新知识点回慢慢补充。