mysql 避免索引失效

mysql 避免索引失效,第1张

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优化中的作用性

mysql数据库索引是一种能够让mysql数据查询更加快速的数据结构,我们在新建数据库的时候,如果设置了某个字段的Primary key主键,那么数据库会默认为我们的主键字段创建一个唯一索引(Unique Index)的东西,所以你就不需要再为此字段创建mysql数据库索引了,当然了,如果你想设置别的字段索引,那么就要额外加入该字段的数据库索引了。

一:Mysql数据库索引的创建

1)如何为我们的mysql数据库添加索引呢?很简单,请看下面的创建mysql普通索引格式:

CREATE INDEX [index name] ON [table name]([column name])

参数说明:NameDescription

index name索引名称.

table name需要添加索引的表名称.

column name需要添加索引的列名称.

例如我们要创建一个索引,就可以使用如下的mysql命令运行即可:CREATE INDEX myindex ON mytable(aut_id)

2)唯一索引的创建,和mysql普通索引差不多,只需要在INDEX关键词前面加入UNIQUE关键词即可,mysql命令如下:CREATE UNIQUE INDEX myindex ON mytable(aut_id)

我们也可以使用USING BTREE关键字,B-tree算法减少定位记录时所经历的中间过程,从而加快存取速度,mysql命令如下:CREATE UNIQUE INDEX myindex ON mytable(aut_id) USING BTREE

二:查看mysql数据库索引

我们可以使用以下命令查询刚刚新建的mysql数据库索引,“from mytable”代表查询该数据库表里面有哪些索引,mysql命令如下:show index from mytable

创建成功之后,会在“key_name”字段中显示刚刚创建的数据库索引名称,如图所示:

三:删除mysql数据库索引

我们也可以使用mysql命令删除某张表的索引,命令如下:drop index english on mytable

四:查询sql语句是否使用了mysql索引

我们上面常见好mysql数据库索引之后,如果想要知道我们在执行sql语句时是否使用了数据库索引,就要在sql语句前面加入“EXPLAIN”关键词,命令如下所示:EXPLAIN SELECT * FROM `allword` where english='America'

如果使用到了我们创建的字段索引,就会看到如图所示的字段都不会是NULL空值,如下:

在有些情况下mysql索引会失效,也就是在执行到sql语句时没有使用到我们创建的数据库表字段索引,可能有以下这些情况:

1:使用了OR关键字查询

2:或者LOWER(),UPPER()函数,

3:还有一种就是使用了LIKE关键字查询,像(like '%XX'或者like '%XX%')这样的语句,但是像(like 'XX%')这种情况的mysql表索引是不会失效的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10038008.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存