利用 force index优化sql语句性能

原创 2015年07月06日 18:32:34

    今天写了一个统计sql,在一个近亿条数据的表上执行,200s都查不出结果。SQL如下:

select customer,count(1) c
from upv_**
where created between "2015-07-06" and "2015-07-07"
group by customer 
having c > 20
order by c desc

    执行explain,发现这个sql扫描了8000W条记录到磁盘上。然后再进行筛选。type=index说明整个索引树都被扫描了,效果显然不理想。


    拿着这个SQL去请教项目组的数据库大牛,仅仅加了一个force index,花了1s多就出结果了。修改后的SQL如下:

select customer,count(1) c
from upv_** force index(idx_created)
where created between "2015-07-06" and "2015-07-07"
group by customer 
having c > 15
order by c desc 

    同样执行以下explain命令,这个SQL仅仅扫描了磁盘的110W行记录。也就是上一个SQL的80分之一。大家都知道,扫描磁盘是很耗时的IO操作,比内存操作慢几个数量级。type=range,说明索引树仅仅被部分扫描,要优于前面那个SQL.


    除了磁盘扫描的行数的不一样,还有采用的索引的不用,上面的sql用的是联合索引,而下面的是单纯的created字段的索引。由于用的是created的索引,驱动条件就是created的区间,需要扫描的数据就立刻变小了,因为时间区间小。后面的SQL的key_len要远远小于前面的SQL,也就意味着要扫描的磁盘上的索引数据量要远远小于前面的SQL。

    第一个sql使用的是错误的索引,带来低效的查询。然后每条SQL只可能使用一个索引。通过上面的分析就可以发现,force index()指令可以指定本次查询使用哪个索引!这样就可以避免MySql优化器用到了一个低效的索引。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Mysql的强制索引(Force Index)都为我们做了哪些优化?

原本只是想验证一下选择不同索引对innodb count(*)查询速度的影响。 各位顺道可参考下这篇文章 [InnoDB系列] -- innodb表如何更快得到count(*)结果。 测试过程...

mysql 操作索引FORCE INDEX

1、创建索引 索引的创建可以在CREATE TABLE语句中进行,也可以单独用CREATE INDEX或ALTER TABLE来给表增加索引。以下命令语句分别展示了如何创建主键索引(PRIMARY ...

mysql 使用force index优化查询

一个简单查询语句,添加一个条件以后,查询速度慢得不能接受,使用force Index 优化此查询...

mysql sql force_index 优化案例

下面的sql运行了27秒 explain SELECT -> COUNT(1) -> FROM -> (SELECT -> ...

通过force index了解的MySQL查询的性能优化

查询是数据库技术中最常用的操作。查询操作的过程比较简单,首先从客户端发出查询的SQL语句,数据库服务端在接收到由客户端发来的SQL语句后, 执行这条SQL语句,然后将查询到的结果返回给客户端。虽然过程...

mysql sql优化实例1(force index使用)

通过实例说明sql优化的步骤,简单介绍了force index优化sql的过程

Mysql建表与索引使用规范整理

一,设计表规范: 1. MySQL建表,字段需设置为非空,需设置字段默认值。 2. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL。 3. MySQL建表,如果字段等价于外键,...

MySQL Study之--Index强制和忽略

MySQL Study之--Index的强制使用和忽略 1、查看表结构 mysql> show create table emp\G *************************** 1. r...
  • lqx0405
  • lqx0405
  • 2015年12月18日 15:00
  • 531

数据库性能优化一:SQL索引一步到位

SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱。   1.1 什么是索引?   SQL索引有两种,...

Mysql分区表使用的一些限制和需要注意的地方

mysql分区策略都基于两个非常重要的假设:查询都能够过滤(prunning)掉很多额外的分区、分区本身并不会带来很多额外的代价。而事实证明,这两个假设在某些场景下会有问题。下面介绍一些可能会遇到的问...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用 force index优化sql语句性能
举报原因:
原因补充:

(最多只允许输入30个字)