栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MySQL中级学习 (八) MySQL入门--深入理解索引

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MySQL中级学习 (八) MySQL入门--深入理解索引

此文是学习索引的总结:

唯一索引:创建唯一索引的列值必须唯一,但是允许值为空。如果创建的唯一索引中包含多个字段,也就是复合索引,则索引中包含的多个字段的值的组合必须唯一。

验证索引提升查询效率: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中支持的其他函数,用处不多,后续再详细研究。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1028529.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号