首页 > 数据库 > > MYSQL 8 INDEX “一网打不尽”

用过MYSQL 的人大多对MYSQL在 INDEX 上建树不到感冒,但实际当中MYSQL 的INDEX 到底简不简单,有多深的水。先不说,我们先说说INDEX 有多少内容,那行是你知道的,那行是你不知道了,我们捋一捋。
1 Index Hints
2 Invisible Indexes
3 Multiple-Column Indexes
4 Descending Indexes
5 Index Condition Pushdown Optimization
其实还有很多没有提到,例如 空间索引,索引优化,索引利用率,Index Merge Optimization,Use of Index Extensions等等
1 index Hints
提到这个东西,其实大家认为每种数据库都应该有这个配置,地区SQL SERVER ,ORACLE ,MYSQL 都有,POSTGRESQL 截止到 11 这个版本是没有这个功能的,到不是POSTGRESQL 差劲,而是人家从另一个方面去入手你的查询优化和走不走索引,当然POSTGRESQL 在12 这个版本也将提供这个功能。
其实说实话,用到 Index hints 这个东西的情况并不是很多,主要用到这个东西的原因 1 语句太复杂,MYSQL 本身的语句优化器出了问题,需要人工介入,2 你的统计信息不完整或者出现问题,所以要进行人工介入
索引 INDEX hints 有两种功能,1 要你用哪个索引 2 不要你用哪个索引
下面举例,
我们建立一个表

并且我们插入三条记录

按理说我们查询语句,按照原理应该使用name 的那个索引,或者就三条记录,不应该走索引,全表扫描就可以了。
但事实大跌眼镜,走了索引还走了那个我们觉得不大适合的

那如此我们应该如何

按理说我们不应该大量使用这样的方式来控制语句使用索引,而应该从其他的方面入手,因为固话语句使用某种索引这样的事情其实是很危险的。
2 Invisible Indexes
Invisible 索引是在MYSQL 8 中提出的,这个功能其实是很有必要的,尤其在繁忙的系统中。
例如,DBA 排查索引的问题,发现大量无用的索引,而又没有人确认这样的索引到底有用没用,这里面就需要使用这个功能。类似在ORACLE 有这样的功能,在SQL SERVER 有一个类似名字的功能,但实际上SQL SERVER 截止 2016这个版本,这个功能还是不要轻易用,虽然叫diabled但他可是删除了你的INDEX 数据,仅仅留下了一个 INDEX 的空壳而已,入坑的人不少。
我们还以上面的例子,我们这次不指定索引了,而是将某些不合适的索引隐藏一下。
例如我们将 name 和 used_name 那个两个字段的索引隐藏掉

这样那个不合时宜的索引就消失了
3 多列查询与索引顺序和要求

如果使用Postgresql , sql server , oracle 这样的数据库多了,其实DBA会变得懒散,因为其实大概率是不会考虑查询语句的顺序和 索引之间的关联性,而MYSQL 的DBA 则必须关注。上图就给了最好的证明,索引都有,即使强制走某些应该认为可以走的索引,数据库也是不含糊的走全表扫描。所以多列索引和相关的语句查询应该是一个需要小心和关注的地方。
4 降序索引 ,这是MYSQL 8 中的一个功能,原先在之前的版本熟悉 的MYSQL的DBER 们都知道一件事,倒序索引很讨厌,因为的filesort一下,小数据量还好,数据量大就会耗费更多的资源和时间,所以MYSQL8 增加了倒序的方式建立索引,和查询。

5 ICP ,经常听到有人说ICP 但到底什么是ICP 我们看一下ICP 的定义以及意义
使用索引中的列就可以计算WHERE条件的一部分,那么MySQL服务器将这部分WHERE条件下推到存储引擎。然后,存储引擎使用索引条目来评估推入的索引条件,只有在满足此条件的情况下,才从表中读取行。如果没有ICP 将产生一个问题就是你索引中如果不包含所有的查询条件的行,则查询会将部分符合条件的数据上升到SERVER层在进行二次过滤,返回结果,而这其中可能有大部分不符合查询条件的记录,而ICP 则恰恰解决了这个问题,在查找出符合索引的数据后,同时会进行数据的其他条件的比对,这样就会大大减少不符合数据的提取在抛弃的做法。
而ICP 适用的范围是指二级索引中的,唯一值得查询,范围的查询,及部分NULL的查询。

原文作者:;如有侵权,请联系管理员删除。