重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1.全值匹配
创新互联建站主要从事网站制作、网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务金华,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:13518219792
2.最佳左前缀法则
3.不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
4.存储引擎不能使用索引中范围条件右边的列
5.尽量使用覆盖索引(只访问索引的查询(索引列和查询列一直)),减少select *
6.mysql在使用不等于(!=或者)的时候无法使用索引会导致全表扫描
7.is null, is not null也无法使用索引
8.like以通配符开头(‘%abc...’)mysql索引失效会变成全表扫描的操作
9.字符串不加单引号索引失效
10.少用or,用它来连接时索引会失效
首先我们还是先把表结构说下:用户表tb_user结构如下:
1、 不要在索引列上进行运算操作, 索引将失效。
手机号phone字段有唯一索引,当根据phone字段进行函数运算操作之后,索引失效:
2、 字符串类型字段使用时,不加引号,索引将失效。
如果字符串不加单引号,对于查询结果,没什么影响,但是数 据库存在隐式类型转换,索引将失效。
3、 如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
接下来,我们来看一下这三条SQL语句的执行效果,查看一下其执行计划:
由于下面查询语句中,都是根据profession(专业)字段查询,profession字段是一个普通的索引, 我们主要看一下,模糊查询时,%加在关键字之前,和加在关键字之后的影响。
经过上述的测试,我们发现,在like模糊查询中,在关键字后面加%,索引可以生效。而如果在关键字 前面加了%,索引将会失效。
4、 用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会 被用到。
由于age没有索引,所以即使id有索引,索引也会失效。所以需要针对于age也要建立索引。
5、 数据分布影响:如果MySQL评估使用索引比全表更慢,则不使用索引。
where条件==order by 条件==group by 条件 按顺序遵守 最佳左前缀法则
假设创建了复合索引:a,b,c
不在索引列上做任何的操作(计算、函数、显式或隐式的类型转换),否则会导致索引失效而转向全表扫描
1、字符不加单引号会导致索引失效
name字段为varchar类型
这条sql发生了隐式的类型转换:数值==字符串。所以导致了全表扫描,索引失效
应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
mysql中的范围条件有:in/not in、 like、 、BETWEEN AND ;
后面的索引失效
in会导致索引全部失效!!!
BETWEEN AND 范围条件不会导致索引失效!!!
尽量让索引列和查询列一致;减少select * 的使用
1、查询表结构
2、查询表的索引结构
联合索引:name,age,post;说明add_time字段没有添加索引
3、查看select * 的执行计划
4、查看 select name,age,pos的执行计划
5、如果select只用一部分索引
like以通配符开头(’%abc…’)mysql索引失效会变成全表扫描的操作。
解决:可以使用 覆盖索引 来解决这个问题!
1、先查看表上的索引
id、name、age、pos 四个字段上都有索引; 注意:name是联合索引中的第一个,带头大哥!
2、查看表结构
有个add_time字段没有用到索引
3、查看执行计划
使用UNION ALL
假设创建了联合索引 x(a,b,c)
ps:like虽然也是范围查询但是区别于、,%用在最前面就只用到索引a了;%用在最后面可以用到a+b+c!
下面的sql几乎违背了上面的所有原则,索引依然全部生效。因为select是索引覆盖的,select里不包含没有建立索引的字段。因此总是用到索引的。可以看出来索引覆盖在sql优化中的作用性
具体原因是:
1、索引列值为null,此时会索引失效。
2、sql的语句中写了or,如果or后的字段不全是带索引字段,此时索引失效。
3、模糊查询是like以%XX开头,就是说左模糊不太行,右模糊可以。
4、存在类型转换,比如你的索引字段是varchar型,但是你搜索条件却是userid=333,那这样索引不生效。
5、数据量极少时,Mysql不会使用索引,因为全表扫描速度更快。
6、where条件中的索引运算设计计算时,索引失效。索引列不要使用函数。
mysql 索引失效的原因有哪些?Mysql索引失效的原因
1、最佳左前缀原则——如果索引了多列,要遵守最左前缀原则。指的是查询要从索引的最左前列开始并且不跳过索引中的列。
2、不在索引列上做任何操作(计算,函数,(自动或者手动)类型装换),会导致索引失效而导致全表扫描。
3、存储引擎不能使用索引中范围条件右边的列,范围之后索引失效。( , between and)。这写条件判断最后放到后面,先定位到小的范围再开始。
4、mysql使用不等于(!= 或者)的时候,无法使用索引,会导致索引失效
5、mysql中使用is not null 或者 is null会导致无法使用索引。
6、mysql中like查询是以%开头,索引会失效变成全表扫描,覆盖索引。
7、mysql中,如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)。要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。
8、如果mysql使用全表扫描要比使用索引快,则不会使用到索引。
相关mysql调优链接:Mysql调优