此文是学习索引的总结:
唯一索引:创建唯一索引的列值必须唯一,但是允许值为空。如果创建的唯一索引中包含多个字段,也就是复合索引,则索引中包含的多个字段的值的组合必须唯一。
验证索引提升查询效率:explain 【sql 语句】;mysql评估全表比索引慢,就回全表扫。
等值匹配:is null 和is not null 根据实际匹配的数据量确定走不走索引,in和not in:in走索引,not in 不走索引
单列索引和复合索引:尽量选择符合索引,少使用单列索引,多个单列索引,只会走辨识度最高的一个索引。
eg:
查看索引使用情况:
show status like 'Handler_read%';
show global status like 'Handler_read%';
mysql中关于read的计数器,有7个。他们的数值对于系统的状况的了解,对于系统的调优都十分重要。首先7个计数器,我们应该分为两部分:
1)对索引读的计数器:前面的5个都是对索引读情况的计数器,
Handler_read_first:是指读索引的第一项(的次数);
Handler_read_key:是指读索引的某一项(的次数);
Handler_read_next:是指读索引的下一项(的次数);
Handler_read_last:是指读索引的最后第一项(的次数);
Handler_read_prev:是指读索引的前一项(的次数);
5者应该有四种组合:
1. Handler_read_first 和 Handler_read_next 组合应该是索引覆盖扫描
2. Handler_read_key 基于索引取值
3. Handler_read_key 和 Handler_read_next 组合应该是索引范围扫描
4. Handler_read_last 和 Handler_read_prev 组合应该是索引范围扫描(orde by desc)
2)对数据文件的计数器:后面的2个都是对数据文件读情况的计数器
后面的2个 Handler_read_rnd 和 Handler_read_rnd_next 是越低越好,如果很高,应该进行索引相关的调优。而Handler_read_key的数值肯定是越高越好,越高代表使用索引读很高。其他的计数器,要具体情况具体分析。
空间索引:MySQL中支持在GEOMETRY数据类型的字段上创建空间索引。
全文索引:创建全文索引时,对列的数据类型有一定的限制,只能为定义为CHAR、VARCHAR和TEXT数据类型的列创建全文索引,全文索引不支持对列的局部进行索引。
注意:在MySQL 5.7之前的版本中,只有MyISAM存储类型的数据表支持全文索引。在MySQL 5.7的部分版本和MySQL 8.x版本中,InnoDB存储引擎也支持创建全文索引。
隐藏索引:MySQL 8.x开始支持隐藏索引,隐藏索引不会被优化器使用,但是仍然需要维护。隐藏索引通常会在软删除和灰度发布的场景中使用。
在MySQL 5.7版本之前,只能通过显式的方式删除索引,此时,如果发现删除索引后出现错误,又只能通过显式创建索引的方式将删除的索引创建回来。如果数据表中的数据量非常大,或者数据表本身比较大,这种操作就会消耗系统过多的资源,操作成本非常高。
从MySQL 8.x开始支持隐藏索引,只需要将待删除的索引设置为隐藏索引,使查询优化器不再使用这个索引,确认将索引设置为隐藏索引后系统不受任何响应,就可以彻底删除索引。这种通过先将索引设置为隐藏索引,再删除索引的方式就是软删除。
创建索引时,将索引设置为隐藏索引,通过修改查询优化器的开关,使隐藏索引对查询优化器可见,通过EXPLAIN对索引进行测试,确认新创建的隐藏索引有效,再将其设置为可见索引。这种方式就是灰度发布。
CREATE INDEX index_name ON table_name (column_name [length]) INVISIBLE;
创建隐藏索引比创建普通索引多一个关键字INVISIBLE,这个关键字就决定了当前的索引为隐藏索引。
函数索引:从MySQL 8.0.13版本开始支持在索引中使用函数或者表达式的值,也就是在索引中可以包含函数或者表达式。函数索引中支持降序索引,同时,MySQL 8.x版本支持对JSON类型的数据添加函数索引。函数索引可以基于虚拟列功能实现。
mysql> CREATE TABLE func_index (
-> c1 VARCHAr(10),
-> c2 VARCHAr(10)
-> );
Query OK, 0 rows affected (0.02 sec)
-- 为fun_index数据表的c1字段创建普通索引。
mysql> CREATE INDEX c1_index ON func_index (c1);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
-- 为func_index数据表的c2字段创建一个将字段值转化为大写的函数索引
mysql> CREATE INDEX c2_index ON func_index ((UPPER(c2)));
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
MySQL 8.x版本支持对JSON类型的数据添加函数索引。·当JSON数据长度不固定时,如果直接对JSON数据进行索引,可能会超出索引长度,通常只截取JSON数据的一部分进行索引。
还有MySQL中支持的其他函数,用处不多,后续再详细研究。



