Mysql group by在100万行之后不使用索引

时间:2016-04-16 08:26:41

标签: mysql

我想在我的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万行后的索引

3 个答案:

答案 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)

为服务器和进程安装更多内存解决了这个问题。