带索引的mysql查询速度慢

带索引的mysql查询速度慢,mysql,indexing,Mysql,Indexing,我有下面的表结构 现在我使用以下查询 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秒。我有日期和类型的索引,我的解释查询显示类型为all。pro

我有下面的表结构

现在我使用以下查询

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秒。我有日期和类型的索引,我的解释查询显示类型为all。prod DB几乎有700000个条目


如何进一步优化此查询???

在您的查询中,您正在使用
DATE(DATE)
提取正在使用的表达式的datetime部分。但是在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;

您可以在

上阅读有关使用索引的更多信息。我相信您正在尝试找到一种方法,以便在查询中引用索引。MySQL文档在这里讨论分组优化:

关于发生松散扫描必须适用的内容,有许多要点。虽然文档中规定只应使用最小值和最大值,但您可能会发现添加以下索引:

ADD INDEX `BTREE_OPT` (`type`, `date`, `amount`) USING BTREE
然后检查explain extended,您会看到新包含的索引用法:

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)

这可能会加快查询速度。

哦,不是这样的。我只是用它来获取日期部分。否则,GROUP BY将显示单个金额,而不是显示每日金额。我理解您不能将其从GROUP BY中删除。但是,在从表中选择日期时,是否只需要日期部分?请检查新的查询。这应该会得到更好的结果。@Neels我不得不问,在fiddle上,它看起来不像是在explain扩展名上使用索引,即使是用index子句指定的。这只是因为没有及时报道吗?是的。。据我所知,UseIndex提示优化器使用定义的索引,在正常情况下,如果定义正确,它应该自动选择这些索引。在这种情况下,您的建议可能会更有效。