问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2024-10-01 10:32

我来回答

1个回答

热心网友 时间:2024-10-22 16:47

前言

后端面试中一定是必问MySQL的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到了mysql,几乎都会遇到Mysql查询需要优化的需求。经常有时候前端业务没有压力,经常会在管理后台逻辑中遇到mysql统计查询压力,可能是代码写太烂了,哈哈。在日常工作中我遇到过同事建立索引后问我某个查询条件是否能命中索引,我只能说模糊记得最左匹配原则不能准确地告诉别人是否能命中索引,我今天就打算彻底解决这个问题。

如何验证联合索引的有效性

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

这里我们简单实践一下,选取一张表:

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

CREATETABLE`videos`(`id`intunsignedNOTNULLAUTO_INCREMENT,`path`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciDEFAULTNULL,`name`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciDEFAULTNULL,`user`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_INCREMENT=36247DEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_general_ci;

这个表的内容是一些抖音的视频的视频名称,作者,保存路径,状态等等信息。

来使用explain关键字试一下执行以下sql语句:

explainselect*fromvideoswhere`user`like'%BY2girl%'

展示信息:

其中展示的详细信息根据文章主题这里不做详细说明吧,就算根据其他资料稍微理解复制过来,我也记不住。

接下来我尝试把这个user这个加一个索引试试:

这里补充说明一下,我直接新建一个B树索引,B树索引一般是默认创建的索引类型,因为相对于哈希索引B树索引可以获得稳定且较好的查询速度,哈希索引更适合适合做精确查询

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

explainselectcount(*)fromvideoswhere`user`like'%BY2girl%';

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

多个单一索引进行验证

接下再加两个索引:

看下简单使用哪些查询会命中索引:

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

果然使用到了3个索引,但是我一直有一个疑问,在中间的查询条件使用like模糊返回查询,看看命中了哪个索引:

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

结论Mysql会自动对sql语句进行优化,把可以命中的查询条件放在最前面让它们命中索引,用来提高查询速度。这样一个字段增加一个索引无疑增加了表的空间,给表记录的新增和修改操作增加了压力,联合索引可以稍微解决这个问题,接下来就要说联合索引。

联合索引

联合索引指的是对一张表上把多个字段当制作成一个索引:

联合最左匹配原则解释:以建立索引的字段为查询条件,执行查询时候左边的为起点任何连续的索引都能匹配上,当遇到范围查询(>、<、between、like)就会停止匹配

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

不用说,这样一定会命中这个联合索引,接下来中间使用一个like试试:

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

完全没有命中索引,中间被打断了,我自己以为会命中了一个user也会命中整个联合索引,我还以为mysql会把name和user两个字段优化在最前面实现最左原则从而命中整个联合索引,学到了,接下来把这个like查询放在最后:

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

看来是命中了这个联合索引,两个索引的命中直接命中了整个联合索引,验证成功。

在其中侧面了解到,我设置索引的顺序和最左匹配原则的顺序不是一一匹配的,user, path这两个字段可能会优化顺序。但是我设置的联合索引的顺序是path, name, user,其中user, path中间有一个name字段的索引,最左匹配原则是依据查询条件来的,跟where 条件顺序相关!

总结

在日常工作中发现阿里云的云数据库会根据数据库热点查询数据自动增加索引,又减轻了某些不会建立索引的人的压力或者减少了建立错误索引的情况,同时自动减少了数据库压力,哈哈。 索引是mysql非常复杂的知识,它又非常重要,后面遇到问题一定要记录下来,亲自实践增加印象,感觉在今天的验证过程中略过了好多复杂的知识,例如一些explain信息的意思,很重要,等到后面遇到了再仔细研究,今天就到这。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
微信限额20万怎样提到30万 微信怎么提升限额 微信限制额度二十万了怎么办 爱奇艺电视版会员电影没声音 爱奇艺怎么没声音了 爱奇艺万能播放器怎么没声音-爱奇艺播放器没声音修复方法 爱奇艺播放没有声音了怎么回事 主持人刘炽朗诵《采桑子·重阳》 卧室空间大了摆放什么风水好 卧室空间大了摆放什么 中国平安金融集团上海分公司这公司是一家怎样的公司?是骗子吗? 取关对方对方知道吗? 奶水出不来涨奶怎么办 奶太多频繁涨奶怎么办,涨奶痛用吸奶器只吸出几滴 30岁阴茎不硬怎么治疗最好 我女朋友马上要过生日了,这是我们在一起她的第一个生日,我想给她过的... 女朋友还有几天就过生日了。可是到现在我都不知道给她送什么。她是双 ... ...了一台长虹变频空调,安装师傅抽真空才抽了3分钟到4分钟这样对空调有... 4芯音响线怎么接线??? ...手机怎么选?1k、千元机、备用机、长辈机、1000元内手机推荐_百度知 ... 电脑维修多钱一次? 好事藏不住会到处去宣扬的面相特征 戴尔Dimension 8300基本参数 想买一部250--400价位的MP4 最主要是看电影 但是也要看小说 推荐一部... D3066次一共有几节车厢,餐车在哪一节车厢 动车组D3066次二等座位图 异性中哪个样子的男人,最能让女人一直忘不掉呢? 我是广东户籍,非深户,能在深圳办理港澳通行证吗?以前从未办过的。_百度... 烤土司温度和时间多少 烤箱如何烤土司 土司烤箱时间和温度是多少 使用JOIN 实现表关联,面试挂了! mysql innodb 在创建外键时报错了#sql-534_b' (errno: 150) 充电仓不亮灯是坏了吗 (304)不锈钢水管十大品牌 ...微信指纹支付,我的在微信支付里设置显示系统错误? 杭州江南实验学校第八届田径运动会入场式视频哪有 中山开设计算机网络技术专业的中专学校名单有哪些 我要坐高铁去广州然后去中山市三乡镇的雅豪苑附近 这是一道普通逻辑的分析题,请懂行的高手们帮忙解答一下,万分感谢... 为什么我打开网页的时候总是会出现这个提示、 求高手帮忙解决... ...连接一台电脑,这是为什么?请高手帮帮忙吧,万分感谢! 什么是体系建设 什么是体系建设的目的和构成要素? 求高手帮忙看图辨别一下两只兔子的公母~万分感谢~!!!(不知道图清楚不清... 请英语高手帮忙人工翻译一下这段话,万分感谢 成都哪些医院有心理咨询科室? 成都心理咨询师培训机构有哪些 我爸爸喜欢吃牛肉馅饺子的翻译 我讨厌吃羊肉,但家里人喜欢吃,而且经常有人送羊肉 EVE新手多米怎么防堵门防抓?