我有一张桌子:
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);
但解释没有任何变化。
文件示例:链接
计划A(不好):
副手,我会说最好是先列出
=
列,然后列出范围:但是……比这更复杂。
本质上是计算日期的函数调用。这使得将
updatedAt
orinterval_before_close
放入索引中毫无用处。B计划(懦弱):
所以...以下可能有用,但前提是没有多少行与这两个标志匹配:
食谱
C计划(复杂):
另一方面,如果您有一个列(真实的或计算的)包含
假设它的列称为
early_close
; 然后改为并添加