一 关于索引
1. 索引概述
- 索引是存储引擎用于快速找到记录的一种数据结构
- 索引的优点:
减少扫描的数据量,加速查询
减少或完全消除数据库的排序操作(ORDER BY),因为索引是有序的
将服务器的随机 IO 变为顺序 IO,例如,想要查询 salary 处于 1500 ~ 2100 的员工,就可以按照索引顺序查询 - 索引的缺点:
索引会占据额外的存储空间(毕竟它是数据结构),包括磁盘和内存
由于对数据需要排序,自然会影响到数据更新(插入、更新、删除)的速度
2. 索引分类
- 普通索引:针对于单个列创建的索引,之所以说它普通是因为它对列值没有什么限制,允许被索引的列包含重复的值
- 唯一索引:正如它的关键字一样,它要求列值是唯一的,这个索引保证了数据记录的唯一性
- 主键索引:它是一种特殊的唯一索引,在一张表中只能定义一个(但不是必须)主键索引
- 联合索引:也被称为复合索引,它是将多个列值绑定在一起作为索引
3. 创建高性能的索引方式
聚簇索引
聚簇索引是 InnoDB 中一个最为特殊的概念,它实际上并不是一种索引类型,而是一种存储数据的方式,且是将索引和数据存储在一起。InnoDB 规定一个表只能有一个聚簇索引,且会使用主键来创建。
对于聚簇索引来说,索引即数据,所以,如果以主键去查询数据,那么只需要一次索引查找即可。
对于非聚簇索引而言,实际存储的是记录主键,所以,还需要根据主键再做一次查询才可以获取到数据,这也就是我们通常所说的 “非主键的二次查询
联合索引
联合索引,它的应用场景是多列 WHERE 查询。例如,对于 worker 表,我们需要做这样的查询:
前缀索引
- 当表中的数据列是字符型,且大多数长度都比较长时,就可以考虑使用列值的一部分前缀作为索引,这也就被称作是前缀索引
- 如何选择比较合适的索引长度,在 MySQL 中专业的叫法是 “索引选择性”(Index Selectivity)。索引选择性是一个数值,它等于 不重复的值 / 所有的值,取值范围介于0到1。1就是代表这一列唯一,没有重复的值。且这个值是可以计算得到的
- 值越接近1索引性能越好
覆盖索引
当一个索引包含需要查询的所有字段时,就称之为覆盖索引
由于索引中已经包含了当前需要查询的两列,就不需要再回数据库查询了,也就是说索引覆盖了数据。通常情况下,索引数据的量级会比真实数据的量级小很多,覆盖索引能够大大的减少从磁盘加载的数据量,也是比较高级的优化手段。
二 查看索引信息
2.1 查看表索引信息
第一种方式: SHOW INDEX FROM WORKER (查看索引字段信息)
第二种方式: SHOW CREATE TABLE worker\G(查看索引建表语句)
2.2 查看索引占据的空间大小
在information_schema.TABLES中查看对应表的总索引大小
SELECT CONCAT(ROUND(SUM(index_length) / (1024*1024), 2), ' MB') FROM information_schema.TABLES;