当前位置: 首页 > 科技观察

MySQL索引失效的几种类型及解决方法

时间:2023-03-13 20:11:45 科技观察

MySQL索引失效有哪些情况?本文列举了以下七种类型和解决方法。1.索引列不独立是指索引列不能是表达式的一部分,也不能是函数的参数,比如下面的情况:selectid,name,age,salaryfromtable_namewheresalary+1000=6000;薪水列是根据用户的表达式计算的。在这种情况下,索引将无效。解决方法是提前计算条件值,不让索引列参与表达式计算。索引字段用作函数的参数:selectid,name,age,salaryfromtable_namewheresubstring(name,1,3)='luc';有什么办法,可以提前算好条件,不要用索引,也可以用Othersql代替上面的,比如上面的sql可以换成like:selectid,name,age,salary来自table_name,其中名称如“luc%”;2.Leftfuzzyselectid,name,age,salaryisusedfromtable_namewherenamelike'%lucs%';尽量避免使用leftfuzzy,可以这样写:selectid,name,age,salaryfromtable_namewherenamelike'lucs%';如果无法避免左模糊查询,可以考虑ES之类的搜索引擎。3.or查询没有对某些字段使用索引selectid,name,age,salaryfromtable_namewherename='lucs'andage>25这种情况下,可以为name和age都创建索引,否则全表将执行扫描。4.字符串条件不使用''selectid,name,age,salaryfromtable_namewherephone=13088772233上面的sqlphone字段类型是字符串类型,但是如果不使用'13088772233',SQL会扫描全表,所以字符串索引应该使用'':selectid,name,age,salaryfromtable_namewherephone='13088772233'5.不符合最左前缀原则的查询有这样一个复合索引index(a,b,c):select*fromtable_namewhereb='1'andc='2'select*fromtable_namewherec='2'//上面两个SQL是不能按索引执行的最左原则,即最左Priority存在。如果我不在,你就不能自己玩。除非自己创建索引,否则可以通过索引执行如下SQL:select*fromtable_namewherea='asaa'andb='1'andc='2'select*fromtable_namewherea='asda'andb='1231'//上面两个是索引的,但是你觉得后面的应该怎么用索引,是全部还是部分取索引?select*fromtable_namewherea='asda'andc='dsfsdafsfsd'6.索引字段没有加notnull约束:select*fromtable_namewhereaisnull;//这条sql不能通过索引执行,isnull条件不能使用索引,只能扫描全表//mysql官方的建议是将字段设置为notnull,所以这种情况下,在mysql中创建表字段的时候,可以设置字符串需要索引为notnulldefault''default空字符串即可7.隐式转换如果关联表的两个字段类型不一致,会发生隐式转换:select*fromtable_namet1leftjointable_name2t2ont1.id=t2.tid;//上面的语句中,如果t1表的id类型和t2表的tid类型不一致,则不能//通过索引执行//解决方法是统一设置字段类型。