mysql查询慢与索引

时间:2014-02-17 10:54:30

标签: mysql indexing

我有以下表格结构。

SQL FIDDLE

现在我正在使用以下查询

SELECT DATE(date),SUM(amount) FROM my_table WHERE type!=5 
AND date BETWEEN '2014-01-01' AND '2014-01-04'
GROUP BY DATE(date) ORDER BY date DESC

此查询正在处理我的开发数据库,​​该数据库只有少量行。但是这对于prod数据库而言非常慢,并且花费将近9秒来显示一周的值。我有日期和类型的索引,我的解释查询显示类型为全部。 prod DB几乎有70万个条目。

如何进一步优化此查询?

2 个答案:

答案 0 :(得分:1)

我相信您正在尝试找到一种方法,以便您的查询引用索引。 MySQL文档在这里讨论了优化组:

http://dev.mysql.com/doc/refman/5.5/en/group-by-optimization.html

关于松散扫描必须适用的内容,有很多要点。虽然文档声明只应使用MIN和MAX,但您可能会发现添加以下索引:

ADD INDEX `BTREE_OPT` (`type`, `date`, `amount`) USING BTREE

然后检查解释扩展,您会看到新包含的索引用法:

mysql> EXPLAIN EXTENDED SELECT DATE( date ), SUM(amount) FROM my_table WHERE TYPE !=5 AND date BETWEEN '2014-01-01' AND '2014-01-04' GROUP BY DATE( date ) ORDER BY date DESC \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: my_table
         type: range
possible_keys: date,type,BTREE_OPT
          key: BTREE_OPT
      key_len: 4
          ref: NULL
         rows: 11
     filtered: 100.00
        Extra: Using where; Using index; Using temporary; Using filesort
1 row in set, 1 warning (0.00 sec)

这可能会加快查询速度。

答案 1 :(得分:0)

在您的查询中,您正在使用DATE(date)来提取正在使用的表达式的日期时间部分。但是在您的DDL中,date已被定义为日期时间。这可能会在执行时产生开销。如果使用正确的数据类型正确定义了DDL,我想可以避免DATE(date)以获得更好的结果。

另一种方法是强制SQL优化器使用应用于列的索引。您可以通过将查询修改为:

来实现此目的
SELECT DATE(date),SUM(amount) FROM my_table 
USE INDEX(type,date) 
WHERE type!=5 
AND date BETWEEN '2014-01-01' AND '2014-01-04'
GROUP BY DATE(date) ORDER BY date DESC;

您可以在http://dev.mysql.com/doc/refman/5.1/en/index-hints.html

了解有关USE INDEX的更多信息