我有张桌子:
CREATE TABLE `t1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`status` enum('new','paid') NOT NULL DEFAULT 'new',
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
`can_be_closed` tinyint(1) NOT NULL DEFAULT '1',
`close_reason` varchar(255) DEFAULT NULL,
`interval_before_close` int(11) NOT NULL DEFAULT '10',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;以及以下选择:
SELECT `id`, `status`, `close_reason` AS `closeReason`, `createdAt`, `updatedAt`
FROM `t1` as t
WHERE (
`t`.`status` = 'new'
AND `t`.`updatedAt` < '2018-06-22 10:14:36' + INTERVAL `interval_before_close` MINUTE
AND `t`.`can_be_closed` = true
)对于此查询,请解释返回一个完整的表扫描。
我试图添加以下索引:
ALTER TABLE `t1`
ADD INDEX `updatedAt` (`updatedAt` ASC);以及:
ALTER TABLE `t1`
ADD INDEX `updatedAt` (`updatedAt` ASC, `interval_before_close` ASC);但在解释上没有任何变化。
Fidle .:链接
发布于 2018-06-22 14:34:08
顺便说一下,我认为最理想的方法是先列出=列(S),然后列出范围:
INDEX(status, can_be_closed, -- in either order
updatedAt) -- last但是..。这比那复杂多了。
'2018...' + INTERVAL interval_before_close ...本质上是计算日期的函数调用。这使得在索引中添加updatedAt或interval_before_close都是无用的。
所以..。以下内容可能很有用,但只有在不多行与这两个标志匹配的情况下才有用:
INDEX(status, can_be_closed) -- in either order烹饪书
另一方面,如果有一个列(实列或计算列)包含
updatedAt - INTERVAL interval_before_close MINUTE假设它的列名为early_close;然后更改为
AND early_close < '2018-06-22 10:14:36'再加上
INDEX(status, can_be_closed, early_close)https://dba.stackexchange.com/questions/210335
复制相似问题