MySQL使用联合索引规则->最左前缀法则,详细的样例说明?

在MySQL中,组合索引的使用遵循最左前缀规则。
该规则要求查询操作从索引列表的最左边开始,并且不能遗漏任何索引列。
一旦查询过程中省略某列,索引就会部分失效,即后续字段索引将不再参与查询。
例如,假设我们有以下组合索引:(Column1,Column2,Column3)。
如果执行一条查询语句,如:SELECT*FROMtableWHEREcolumn1='value1'ANDcolumn2='value2',则该查询将充分利用组合索引的效率,因为它遵循最左前缀规则。
但是,当使用范围查询时,例如:SELECT*FROMtableWHEREcolumn1>'value1'ANDcolumn2='value2',某些索引会失败,因为查询忽略了组合索引中的column1列。
为了避免索引失败,可以修改查询语句:SELECT*FROMtableWHEREcolumn1>='value1'ANDcolumn2='value2',从而保证查询始终从最左边的列开始,并完全使用索引。
此外,在执行具有多个条件的查询时,确保每个条件都从最左边的列开始可以最大限度地提高索引使用效率。
例如查询语句:SELECT*FROMtableWHEREcolumn1='value1'ANDcolumn2LIKE'%search_string%',如果column1列在组合索引中,即使column2列没有出现在最左边的列索引中,查询仍然可以查询到有效使用索引。
简而言之,遵循最左前缀规则对于有效使用MySQL联合索引非常重要。
确保查询语句正确从最左边的列开始设计查询可以显着提高查询性能并减少查询时间,从而优化数据库的整体性能。

验证Mysql中联合索引的最左匹配原则

前言

后端面试必问MySQL之前的面试中好几个面试官都反映我MySQL基础不好,今天就练习一下自己的薄弱知识。
索引优化是Mysql调优中非常重要的方法,无论公司规模有多大,只要后端项目使用了mysql,几乎总能满足优化Mysql查询的需要。
有时候前端业务没有压力,但是我在管理后端逻辑中经常面临mysql统计查询的压力。
可能是代码写得太差了,哈哈。
在日常工作中,我经常遇到同事问我,在设置索引后,某个特定的搜索词是否可以命中索引。
我只能说我依稀记得最左边的匹配原理,无法准确告诉别人是否能命中索引。
我今天打算解决这个问题。

如何验证共享索引的有效性

使用explain,在select语句前使用explain关键字会返回该SQL语句的执行计划信息,而不是运行该SQL。

这里我们只是练习一下,选择一个表:

有兴趣的同学可以用这个SQL语句生成一个一模一样的表:

可创建的“视频”(“id”intunsignedNOTNULLAUTO_INCRMENT,“路径”varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciDEFAULTNULL,`名称`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciDEFAULTNULL,`用户`varchar(50)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciDEFAULTNULL,`like`intDEFAULTNULL,`unlike`intDEFAULTNULL,`status`tinyint(1)DEFAULTNULL,`count`intDEFAULT'0',`type`tinyintDEFAULT'1'COMMENT'1美2励志',PRIMARYKEY(`id`)USINGBTREE)ENGINE=InnoDBAUTO_INCRMENT=36247DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_general_ci;

这个表的内容是视频名称、作者等对于某些人,状态抖音视频和其他信息。

我们尝试使用explain关键字执行以下SQL语句:

explainselect*fromvideoswhere`user`like'%BY2girl%'查看信息:

这里根据文章主题不详细解释显示的详细信息,尽管根据其他信息有所了解即使我复制它,我也想不起来。

然后我将尝试为该用户添加索引:

这里额外解释一下,我想直接创建一个新的B树索引B树索引一般都是标准索引,因为相比哈希索引,B树索引实现稳定且更好的查询速度,哈希索引更适合精准查询。

看看不加索引和加索引同一个查询的exp有什么区别lain:

解释selectcount(*)fromvideoswhere`用户`喜欢'%BY2girl%';

可以看到key关键字列使用了我自己命名的user_key索引。

更多单个索引进行确认

然后再添加两个索引:

让我们看看哪些简单搜索会命中索引:

解释select*fromvideoswhere`user`='BY2'and`path`='BY2'and`name`='BY2'

果然,使用了3个索引,但是当我有一个查询在中间搜索条件中使用等模糊返回查询来查看命中了哪个索引:

解释select*fromvideoswhere`user`='BY2'和`path`like'%BY2%'和`name`。
='BY2'

结论Mysql会自动优化sql语句,并在前面添加可以命中的搜索词,以便它们能够命中索引。
提高查询速度。
对这样的字段添加索引无疑会增加表的索引空间和增加表项的新建和修改操作的压力可以解决这个问题。
接下来我们谈谈联合指数。

共享索引

共享索引是指将表中的多个字段视为一个索引:

最左边术语的解释匹配原理:索引字段作为查询条件explainselect*fromvideoswhere`user`='BY2'and`path`='BY2'and`name`='BY2'</那不用说,这肯定会起作用点击这个通用索引,然后使用中间尝试一下:

explainselect*fromvideoswhere`user`='BY2'and`path`like'%BY2%'and`name`='BY2'

根本没有生命中间索引被中止。
我以为会命中一个用户,而且我还以为MySQL会优化name和user字段来实现最左原则,命中整个普通索引,现在把这个类似的查询放在最后:

explainselect*fromvideoswhere`user`='BY2'and`path`='BY2'and`name`like'%BY2%'

似乎已经触及了这个常见问题索引,命中两个索引直接命中整个公共索引,验证成功。

从页面得知,我放置索引的顺序和最左匹配原则的顺序不符。
use和path这两个字段可以优化顺序。
但我设置的普通索引的顺序是路径、名称、用户。
用户和路径中间有一个名称字段的索引。
最左边的匹配原则是根据查询条件,与where条件的顺序有关!

总结

在日常工作中,我发现阿里云的云数据库会根据数据库热点查询数据自动添加索引,这也减轻了一些不知道如何创建索引的人的压力或者减少了错误索引的数量同时数据库压力自动降低,哈哈。
索引是MySQL非常复杂的一个知识,以后遇到问题的时候非常重要,记录下来,自己练习一下,增加印象。
我感觉今天的验证过程中跳过了很多复杂的知识,因为某个东西的意义解释了信息,这一点很重要,等以后遇到了再仔细研究一下,今天就到此为止。

mysql索引,最左前缀匹配的内部原理是什么?

普通索引的最左前缀原则是基于B+树的索引结构特点。
如果我们创建一个包含多个列的共享索引,例如例如“(id_card,name)”,该索引被视为多维B+树。
如果查询语句只涉及共享索引中最左边的列,例如例如“id_card”,查询时可以直接利用这个索引进行快速定位和数据检索,而无需返回表,极大地提高了查询效率。
这是因为共享索引的键值是按顺序排列的,即h.首先比较“id_card”的值,如果“id_card”相等,则比较“name”的值。
这种排序功能可以让查询直接跳过不满足条件的部分,只在需要的时候才进行表查询,从而减少执行时间。
但是,一旦查询条件影响索引中的非最左列,例如例如,如果只查询“name”,则无法直接使用索引“(id_card,name)”,需要额外的回表操作才能获取完整的数据行。
共享索引的最左前缀原则可以让我们最大化索引效益,提高查询性能。
同时,索引设计需要考虑查询频率和结构,以达到最佳的性能优化。