联合索引查询原理及生效规则

哎呀,这个共同的线索,我们需要谈谈。
我们先说一下查询原理。
它就像一本书的目录,汇集了几个信息点,可以让我们快速找到想要的信息。

例如,如果我们要查“张小强数学一班”的结果,它会首先在索引页中使用二分查找,就像在图书馆找一本书一样,先找到该页,然后找到该页上的具体记录。
这个索引页就像一本书的封面,上面写着最小的关键词。

接下来我们看看生效的规则。
这取决于我们如何编写查询语句。
例如,要充分利用这个索引,我们需要按照索引顺序编写查询条件,并且需要使用等号来匹配。
就像我们搜索一本书时,我们先搜索这个类别,然后再搜索那个类别。

最左边的列匹配。
就像找一本书一样。
我们需要先找到这一行,然后找到这一列。
你不能跳过这本书的前面,直接看后面。

还有一个最左边的前缀匹配,这取决于我们是在寻找明确的内容还是模糊的内容。
例如,如果我们想查找以“1 ”开头的内容,我们可以使用索引;但如果它是“%class”,它将不起作用,因为我们不知道它是什么类。

按范围搜索,取决于我们是否从左到右搜索。
如果从“Class 1 ”到“Class 5 ”搜索,可以使用索引;但如果你换个角度看,那就行不通了。

最后是相等匹配+范围匹配,就看我们如何组合条件了。
例如,如果先检查相等条件,然后检查范围条件,则第一个相等条件可以使用索引,后续范围条件必须查看它们是否连续。

总之,联合索引用得好可以大大提高查询效率,用得不好就会造成浪费。
在设计时,我们需要根据查询要求安排字段的顺序,并编写正确的查询语句。
这就像当你找一本书时,你必须知道如何快速找到你想要的那本书。

mysql联合索引最左匹配原则的原因

哈,你提到的最左边常见的索引匹配原理,我之前在实际工作中遇到了一些问题,现在说一下。

我记得2 02 3 年我在上海的一个购物中心做的一个项目中,我们使用了MySQL数据库来存储产品信息。
为了提高查询效率,我们为商品名称、价格、类别创建了通用索引。
结果,曾经有一位客户问我,为什么他在寻找特定价格的产品时,查询速度特别慢。

一开始我也不确定,后来仔细分析数据库执行计划,发现查询条件只使用了价格字段,而没有使用商品名称和类别。
这就导致MySQL没有按照共享索引的最左匹配原则来使用索引,而是进行全表扫描。

我解释说,通用索引就像一本书的目录。
最左边的字段就像目录的第一页。
只有从第一页才能根据目录找到相关内容。
如果只看中间章节,就如同翻书一样,效率自然低下。

此外,最左匹配原则还有一个优点,就是可以提高索引的选择性。
高选择性索引意味着查询可以更快地缩小搜索空间并减少扫描的数据量。
然而,这并不是绝对的。
我还在思考这个问题,即当我遇到范围查询时,例如搜索价格在某个范围内的产品,MySQL将停止使用尾随索引字段。
这就要求我们在设计查询时尽量避免在共享索引的最左边字段使用范围查询。

总之,共享索引的最左匹配原则对于提高MySQL查询效率非常重要。
在实际应用中,要注意索引的设计和查询条件的书写,这样才能充分发挥索引的作用。
无论如何,这取决于你。
这个原则非常重要,千万不要忽视。

面试中常被提到的最左前缀匹配原则

说白了,面试中经常提到的最左前缀匹配原则,其实是MySQL处理共享索引时的一个基本规则。
其实很简单。
当MySQL使用共享索引检索数据时,它总是从索引最左边的字段开始匹配。
我们先来说说最重要的事情。
比如你有一个(a,b)的共享索引,那么只要你的查询条件包含a字段,MySQL就可以使用这个索引。

还有一点,这个原理在解释解释结果的时候也很有用。
您看到类型字段了吗?显示查询的连接类型。
key_len字段表示所使用的索引的实际长度。
比如我们去年开发的项目中,查询性能无法提升,就是因为我们没有关注这个细节。

一开始我也以为只要创建了共享索引,MySQL就可以自动使用它。
后来发现不对劲,不得不严格遵循查询中匹配最左边前缀的原则。
等等,还有一件事。
当查询条件包含范围查询时,比如范围id,MySQL可以使用范围索引,但如果超出范围的字段没有排序,仍然会扫描全表。

很多人没有注意到这一点,但这实际上是一个陷阱。
我认为值得尝试的是,在创建共享索引时,优先考虑查询中经常使用的字段,并确保它们包含在索引的前面。
当然,注意不要使用索引,否则会影响性能。

简而言之,了解最左前缀匹配的原理对于优化查询性能至关重要,因为它会影响数据库使用共享索引检索数据的效率。
你怎么认为?您是否遇到过因为不遵循这个原则而导致的查询性能问题?

一篇文章讲清楚MySQL的聚簇/联合/覆盖索引、回表、索引下推

聚集索引:InnoDB表,主键索引叶子节点存储完整的行数据。
2 008 版本的MySQL 5 .6 使用默认的主键聚集索引。

非聚集索引:非主键索引叶子节点存储索引字段+主键ID。
在2 008 版本的MySQL 5 .6 中,需要向表返回非聚集索引。

联合索引:(年龄,姓名)创建索引,匹配原则在最左边。
在2 01 0版本的MySQL 5 .7 中,年龄查询索引不可用。

覆盖索引:所有查询字段都在索引中,不需要返回表。
在2 01 2 年的MySQL 5 .8 版本中,(age,name)查询全部在索引中,不返回表。

返回表查询:索引字段不完整,必须使用主键返回表。
在2 01 2 年的MySQL 5 .8 版本中,(age)查询必须返回表。

索引下推:索引级别过滤条件,减少返回表的行数。
从2 01 4 年开始,MySQL 5 .7 版本中,(age, name)过滤age以减少表返回。

不要这样做:不按查询顺序创建索引。