首先我们还是先把表结构说下:用户表tbuser结构如下:CREATETABLEtbuser(idint(11)NOTNULLAUTOINCREMENTCOMMENT主键,namevarchar(50)NOTNULLCOMMENT用户名,phonevarchar(11)NOTNULLCOMMENT手机号,emailvarchar(100)DEFAULTNULLCOMMENT邮箱,professionvarchar(11)DEFAULTNULLCOMMENT专业,agetinyint(3)unsignedDEFAULTNULLCOMMENT年龄,genderchar(1)DEFAULTNULLCOMMENT性别,1:男,2:女,statuschar(1)DEFAULTNULLCOMMENT状态,createtimedatetimeDEFAULTNULLCOMMENT创建时间,PRIMARYKEY(id),KEYindexuserproagesta(profession,age,status))ENGINEInnoDBAUTOINCREMENT25DEFAULTCHARSETutf8 1、不要在索引列上进行运算操作,索引将失效。 手机号phone字段有唯一索引,当根据phone字段进行函数运算操作之后,索引失效:查询手机号最后两位是15的用户explainselectfromtbuserwheresubstring(phone,10,2)15; 2、字符串类型字段使用时,不加引号,索引将失效。 如果字符串不加单引号,对于查询结果,没什么影响,但是数据库存在隐式类型转换,索引将失效。 3、如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。 接下来,我们来看一下这三条SQL语句的执行效果,查看一下其执行计划: 由于下面查询语句中,都是根据profession(专业)字段查询,profession字段是一个普通的索引,我们主要看一下,模糊查询时,加在关键字之前,和加在关键字之后的影响。 explainselectfromtbuserwhereprofessionlike软件;explainselectfromtbuserwhereprofessionlike工程;explainselectfromtbuserwhereprofessionlike工; 经过上述的测试,我们发现,在like模糊查询中,在关键字后面加,索引可以生效。而如果在关键字前面加了,索引将会失效。 4、用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。explainselectfromtbuserwhereid10orage23; 由于age没有索引,所以即使id有索引,索引也会失效。所以需要针对于age也要建立索引。 5、数据分布影响:如果MySQL评估使用索引比全表更慢,则不使用索引。