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
猜你喜欢
- 一、连接MYSQL。 格式: mysql -h主机地址 -u用户名 -p用户密码&nbs
- 折线图介绍折线图和柱状图一样是我们日常可视化最多的一个图例,当然它的优势和适用场景相信大家肯定不陌生,要想快速的得出趋势,抓住趋势二字,就会
- 前言大家都知道Python内置的常量不多,只有6个,分别是True、False、None、NotImplemented、Ellipsis、_
- 本文实例讲述了Python基于Matplotlib库简单绘制折线图的方法。分享给大家供大家参考,具体如下:Matplotlib画折线图,有一
- 我就废话不多说了,大家还是直接看代码吧~import tensorflow as tfimport syswith tf.variable_
- 这次主要教的是如何通过Python 获取Windows系统下的所有的磁盘盘符,以列表的形式展示出来,获取磁盘号下的盘符包括能够获取到我们正在
- WITH ROLLUP 在生成包含小计和合计的报表时,ROLLUP 运算符很有用。ROLLUP 运算符生成的结果集类似于 CUBE 运算符所
- 一、利用外键约束更新MySQL中的数据现在,最流行的开源关系型数据库管理系统非MySQL莫属,而MySQL又支持多个存储引擎,其中默认的也是
- 题目:来自Madrid且订单数少于3的消费者 建表:set nocount on --当 SET NOCOUNT 为
- 名片管理系统有两个模块组成:cards_main.py 和 cards_tools.py一个是主程序,另一个是封装增删改查函数的被调用程序代
- 1.写作背景Tensorflow官方在2018年宣布,正式发布支持树莓派版本的Tensorflow,编者开始直接用:pip install
- Mysql安装的时候可以有msi安装和zip解压缩两种安装方式。zip压缩包解压到目录,要使用它还需对它进行一定的配置。下面对Mysql压缩
- 在pandas中怎么样实现类似mysql查找语句的功能:select * from table where column_name = so
- 原数据lambda函数处理我之前写了各种if substr函数,各种报错正确到热泪盈眶的函数data['Followers/Fans
- 一、dict推导式list1 = ['name', 'age', 'gender']list
- CentOS7服务器中apache、php7以及mysql5.7的配置代码如下所示:yum upgradeyum install net-t
- 在深入研究这些库之前,首先,我们需要一个数据库来绘制数据。我们将在本完整教程中使用 tips database。让我们讨论一下这个数据库的简
- 如何使用Office Chart 9.0 制作图表?代码如下:chart90.asp<HTML><HEAD><
- 本文实例讲述了Python使用sort和class实现的多级排序功能。分享给大家供大家参考,具体如下:# -*- coding:utf-8
- 保持良好的代码风格是每个Coder必学的课程,同样在HTML设计的时候也要特别注意代码的规范性,虽然说不规范的代码不会直接造成严重的后果,但