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_key
和Handler_read_rnd_key
两个变量,如果Handler_read_key值很高而Handler_read_rnd_key的值很低,则表明索引经常不被使用,应该重新考虑建立索引。可以通过:show status like 'Handler_read%'
来查看着连个参数的值。
关于如何正确创建Mysql的索引,请参考怎样正确创建MySQL索引的方法详解;众所周知,数据表索引可以提高数据的检索效率,也可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本;但索引并不是时时都会生效的,比如以下几种情况,将导致索引失效:
1.如果条件中有or,即使其中有条件带索引也不会使用索引(这也是为什么SQL语句中尽量少用or的原因)
注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引。
2.对于多列索引,不是使用的第一部分,则不会使用索引。
3.like查询是以%开头时不会使用索引。
4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。
5.如果 mysql 估计使用全表扫描要比使用索引快,则不使用索引。
此外,查看索引的使用情况
show status like 'Handler_read%';
大家可以注意:
handler_read_key
:这个值越高越好,越高表示使用索引查询到的次数。
handler_read_rnd_next
:这个值越高,说明查询越低效。
来源:http://www.codetc.com/article-185-1.html


猜你喜欢
- 本文实例讲述了Python直接赋值、浅拷贝与深度拷贝。分享给大家供大家参考,具体如下:直接赋值:其实就是对象的引用(别名)。浅拷贝(copy
- 前言在最初搭建公司监控系统的时候,最头疼的是需要把同类项目组的相同图形添加到一个Screens,由于只能一个一个的添加,非常耗时耗经历。下面
- 之前一直遇到js插件生成的元素,click事件无效的问题,重新绑定也不行,终于找到解决方法,在此记下来。同时加深对js事件处理机制的理解。1
- javascript上下滑动广告效果 参数说明:客服果果(
- 本文实例讲述了python获取文件后缀名及批量更新目录下文件后缀名的方法。分享给大家供大家参考。具体实现方法如下:1. 获取文件后缀名:#!
- 今天想把classification_report的统计结果输出到文件中,我这里分享一下一个简洁的方式:我的pandas版本:pandas
- 目录小而美简单至上避免空值选择数据类型的步骤数据类型介绍一、串数据类型二、数值数据类型三、日期和时间数据类型四、二进制数据类型结语:小而美通
- 本文我们来做一个简单的随机漫步数据图,进一步了解matplotlib的使用,使用Python生成随机漫步数据,再使用matplotlib绘制
- 一.Memory Dumps 1).Global Area ALTER SESSION SET EVENTS ‘immediate trac
- 很多朋友想用SQL2000数据库的编程方法,但是却又苦于自己是学ACCESS的,对SQL只是一点点的了解而已,这里我给大家提供以下参考---
- 前言刚接触golang不久,有些环境无法融会贯通,现在针对开发过程中遇到的问题做个排查记录问题背景开发环境区分不同网段,同一个程序引入到另一
- 在NLP中,数据清洗与分词往往是很多工作开始的第一步,大多数工作中只有中文语料数据需要进行分词,现有的分词工具也已经有了很多了,这里就不再多
- python爬取淘宝商品销量的程序,运行程序,输入想要爬取的商品关键词,在代码中的‘###'可以进一步约束商品的属性,比如某某作者的
- 前言在程序中我们经常可以看到有很多的加密算法,比如说MD5 sha1等,今天我们就来了解下这下加密算法的吧,在了解之前我们需要知道一个模块嘛
- multiprocessing.Pipe([duplex]) 返回2个连接对象(conn1, conn2),代表管道的两端,默认是双向通信.
- 本文实例讲述了jQuery实现弹出带遮罩层的居中浮动窗口效果。分享给大家供大家参考,具体如下:<!doctype html>&l
- 目录简述:实战案例:简述:关于敏感词过滤可以看成是一种文本反垃圾算法,例如 题目:敏感词文本文件 filtered_words.t
- Ubuntu Server下启动/停止/重启MySQL数据库的三种方式系统环境:ubuntu server 12.10 x64(mysql为
- one: declare @s varchar(20) declare @i varchar(20) set @i='' s
- 1.首先到jetbrains下载专业版 https://www.jetbrains.com/pycharm/download/#sectio