Mysql中SQL语句不使用索引的情况

作者:CODETC 时间:2024-01-28 04:19:57 

MySQL查询不使用索引汇总

众所周知,增加索引是提高查询速度的有效途径,但是很多时候,即使增加了索引,查询仍然不使用索引,这种情况严重影响性能,这里就简单总结几条MySQL不使用索引的情况

如果MySQL估计使用索引比全表扫描更慢,则不使用索引。例如,如果列key均匀分布在1和100之间,下面的查询使用索引就不是很好:select * from table_name where key>1 and key<90;

如果使用MEMORY/HEAP表,并且where条件中不使用“=”进行索引列,那么不会用到索引,head表只有在“=”的条件下才会使用索引

用or分隔开的条件,如果or前的条件中的列有索引,而后面的列没有索引,那么涉及到的索引都不会被用到,例如:select * from table_name where key1='a' or key2='b';如果在key1上有索引而在key2上没有索引,则该查询也不会走索引

复合索引,如果索引列不是复合索引的第一部分,则不使用索引(即不符合最左前缀),例如,复合索引为(key1,key2),则查询select * from table_name where key2='b';将不会使用索引

如果like是以‘%'开始的,则该列上的索引不会被使用。例如select * from table_name where key1 like '%a';该查询即使key1上存在索引,也不会被使用

如果列为字符串,则where条件中必须将字符常量值加引号,否则即使该列上存在索引,也不会被使用。例如,select * from table_name where key1=1;如果key1列保存的是字符串,即使key1上有索引,也不会被使用。

从上面可以看出,即使我们建立了索引,也不一定会被使用,那么我们如何知道我们索引的使用情况呢??在MySQL中,有Handler_read_keyHandler_read_rnd_key两个变量,如果Handler_read_key值很高而Handler_read_rnd_key的值很低,则表明索引经常不被使用,应该重新考虑建立索引。可以通过:show status like 'Handler_read%'来查看着连个参数的值。

关于如何正确创建Mysql的索引,请参考怎样正确创建MySQL索引的方法详解;众所周知,数据表索引可以提高数据的检索效率,也可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本;但索引并不是时时都会生效的,比如以下几种情况,将导致索引失效:

1.如果条件中有or,即使其中有条件带索引也不会使用索引(这也是为什么SQL语句中尽量少用or的原因)

Mysql中SQL语句不使用索引的情况

注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。

2.对于多列索引,不是使用的第一部分,则不会使用索引。

3.like查询是以%开头时不会使用索引。

Mysql中SQL语句不使用索引的情况

4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。

Mysql中SQL语句不使用索引的情况

5.如果 mysql 估计使用全表扫描要比使用索引快,则不使用索引。

此外,查看索引的使用情况


show status like 'Handler_read%';

大家可以注意:

handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。

handler_read_rnd_next:这个值越高,说明查询越低效。

来源:http://www.codetc.com/article-185-1.html

标签:mysql,sql语句,不使用索引
0
投稿

猜你喜欢

  • 深入理解Python对Json的解析

    2023-10-18 20:01:38
  • python实现五子棋程序

    2022-05-26 23:24:31
  • Centos7.2 编译安装PHP7.0.2的步骤

    2023-10-08 12:51:29
  • js将table的每个td的内容自动赋值给其title属性的方法

    2023-08-07 18:34:54
  • Go语言context上下文管理的使用

    2023-06-16 03:55:26
  • 通俗易懂详解Python基础五种下划线作用

    2024-01-01 06:36:22
  • Python-OpenCV基本操作方法详解

    2021-11-25 20:40:01
  • Python3+Requests+Excel完整接口自动化测试框架的实现

    2022-12-12 00:19:52
  • sql server中Select count(*)和Count(1)的区别和执行方式

    2024-01-23 11:47:39
  • Script块放在另一个Script 块内方法

    2009-02-04 15:43:00
  • Django操作cookie的实现

    2023-06-07 17:05:21
  • python简单获取本机计算机名和IP地址的方法

    2021-04-18 01:46:16
  • python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案

    2021-10-02 12:40:16
  • jenkins配置163邮箱的操作方法

    2023-08-10 22:54:05
  • Django使用unittest模块进行单元测试过程解析

    2021-04-03 13:09:08
  • CentOS 7 安装python3.7.1的方法及注意事项

    2023-03-10 21:23:53
  • Python动态规划实现虚拟机部署的算法思想

    2022-12-13 05:02:47
  • 深入了解Golang 哈希算法之MD5、SHA-1和SHA-256

    2024-05-05 09:34:51
  • Python socket实现的简单通信功能示例

    2023-03-03 07:49:40
  • 关于最新IDEA2020.2.1,2.2,3以上破解,激活失效,重新激活的问题

    2023-11-26 00:32:37
  • asp之家 网络编程 m.aspxhome.com