国内最专业的IT技术学习网

UI设计

当前位置:主页 > UI设计 >

这句简单的SQL,如何加索引?颠覆了我多年的认

发布时间:2019/09/03标签:   索引    点击量:

原标题:这句简单的SQL,如何加索引?颠覆了我多年的认
不烦琐,间接入正题。成绩是如许的。叨教上面的sql语句,要想放慢查问速率,该怎样创立索引?以下,以mysql数据库为准。select*fromtestwherea=?andb>?orderbyclimit0,100成果能够会出乎你的预料。咱们起首预备一下运转情况,而后依照最左前缀准则和explain要害字来停止考证。成果真是推翻了xjjdog多年的认知。预备阶段为了停止考证,咱们创立一个简略的数据表。外面有a、b、c三个简略的int字段。CREATETABLE`test`(`id`int(11)NOTNULL,`a`int(11)DEFAULTNULL,`b`int(11)DEFAULTNULL,`c`int(11)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBDEFAULTCHARSET=utf8接上去,写一个简略的存储进程,来拔出10w条数据。等候大概1分钟,数据拔出结束。DROPPROCEDUREIFEXISTStest_initData;DELIMITER$CREATEPROCEDUREtest_initData()BEGINDECLAREiINTDEFAULT1;WHILEi<=100000DOINSERTINTOtest(id,a,b,c)VALUES(i,i*2,i*3,i*4);SETi=i+1;ENDWHILE;END$CALLtest_initData();因为mysql有最左前缀准则,咱们对abc三列停止了全陈列,创立了6个索引。这6个索引涵盖了全部的依据abc查问的情形。createINDEXidx_a_b_contest(a,b,c);createINDEXidx_a_c_bontest(a,c,b);createINDEXidx_b_a_contest(b,a,c);createINDEXidx_b_c_aontest(b,c,a);createINDEXidx_c_a_bontest(c,a,b);createINDEXidx_c_b_aontest(c,b,a);应用Explain停止考证1、主动选用索引explainselect*fromtestwherea>10andb>10orderbyc起首,咱们拿下面的sql语句停止考证。成果发觉,查问应用了索引idx_a_b_c,只用到了前缀a,b。而extra局部,则用到了filesort,也就是机能十分差的方法。咱们实验换一下查问参数的地位。explainselect*fromtestwherec>10andb>10orderbya此次索引主动抉择了idx_b_a_c,但依旧应用的filesort,查问后果是一样的。依照下面的逻辑,不是应当抉择idx_b_c_a么?2、指定索引接上去应用force index方法,强迫指定索引。这里间接给出成果,就是上面的sql。explainselect*fromtestFORCEINDEX(idx_c_b_a)wherea>10andb>10orderbyc成果以下。咱们应用force index来指定应用的索引。此次后果十分好,表现应用了index,应用了where,只在索引上就实现了操纵。但扫描的行数却增添了。然而,这与咱们的教训是相悖的。idx_c_b_a的索引,是在字段(c,b,a)上创立的。依照最左准则,支撑的搜寻前提有:c,cb,cba。在这个例子中,order by前面的参数,却被看成了前缀的头部信息。咱们删掉其余索引,只留下idx_c_b_a,而后去掉force index局部。成果发觉,mysql当初可能主动的抉择索引了。再看别的一种情形,order by上有两个参数。explainselect*fromtestFORCEINDEX(idx_b_c_a)wherea>10orderbyb,c

上一篇:如何在磁盘上查找 MySQL 表的大小

下一篇:没有了

返回
版权信息Copyright ? IT技术教程 版权所有??? ICP备案编号:鲁ICP备09013610号