我有以下表格结构。
现在我正在使用以下查询
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万个条目。
如何进一步优化此查询?
答案 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;
了解有关USE INDEX的更多信息