我想在我的MySql innodb表上运行一些查询,如下所示
EXPLAIN SELECT
id,
SUM(quantity* price1) AS price1sum,
SUM(quantity* price2) AS price2sum,
SUM(quantity) AS quantitysum
FROM
mytable
WHERE
date between '2015.01.01' AND '2015.03.18'
GROUP BY id
结果如下(全部好)
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE mytable range date date 3 922060 Using where; Using temporary; Using filesort
我的问题是,如果我增加查询未运行的日期范围,则解释会给出以下响应。
EXPLAIN SELECT
id,
SUM(quantity* price1) AS price1sum,
SUM(quantity* price2) AS price2sum,
SUM(quantity) AS quantitysum
FROM
mytable
WHERE
date between '2015.01.01' AND '2015.03.19'
GROUP BY id
结果是(糟糕)
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE mytable index date id 4 5563915 Using where
如果我强制它使用带有FORCE INDEX(日期)的索引,它会起作用但是为什么它默认不使用索引?
我试图调整mysql服务的配置文件,但我现在找到了对此问题的任何引用。
修改
显示可创建的输出:
CREATE TABLE `mytable` (
`primary` int(10) NOT NULL AUTO_INCREMENT,
`id` int(10) NOT NULL,
`quantity` double(10,3) NOT NULL,
`price1` double(12,4) NOT NULL,
`price2` double(12,4) NOT NULL,
`date` date NOT NULL,
PRIMARY KEY (`primary`),
KEY `id` (`id`),
KEY `date` (`date`),
ENGINE=InnoDB AUTO_INCREMENT=5470283 DEFAULT CHARSET=utf8
EDIT2:
我注意到mysql开始不使用100万行后的索引
答案 0 :(得分:1)
尝试在操作员之间进行搜索。因为据我所知,运算符之间没有使用日期索引。像这样重写你的查询并再次重试(在我的情况下它不起作用,但在某些mysql版本上它将起作用):
EXPLAIN SELECT
id,
SUM(quantity* price1) AS price1sum,
SUM(quantity* price2) AS price2sum,
SUM(quantity) AS quantitysum
FROM
mytable
WHERE
date >= '2015.01.01' AND date <= '2015.03.18'
GROUP BY id
我认为这个问题是一个mysql优化器bug。在大范围优化器上,决定使用所有表比使用索引更好。您可以在此处看到有关此问题的错误报告:https://bugs.mysql.com/bug.php?id=58190
答案 1 :(得分:0)
可能是您将日期字段编入索引两次?请检查一下。 你能在这里写下&#34; SHOW CREATE TABLE mytable&#34;的结果吗?查询?我想查看你的表格,索引和类型
答案 2 :(得分:0)
为服务器和进程安装更多内存解决了这个问题。