首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择性能指标

选择性能指标
EN

Database Administration用户
提问于 2018-06-22 07:53:06
回答 1查看 46关注 0票数 0

我有张桌子:

代码语言:javascript
复制
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;

以及以下选择:

代码语言:javascript
复制
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
)

对于此查询,请解释返回一个完整的表扫描。

我试图添加以下索引:

代码语言:javascript
复制
ALTER TABLE `t1` 
ADD INDEX `updatedAt` (`updatedAt` ASC);

以及:

代码语言:javascript
复制
ALTER TABLE `t1` 
ADD INDEX `updatedAt` (`updatedAt` ASC, `interval_before_close` ASC);

但在解释上没有任何变化。

Fidle .:链接

EN

回答 1

Database Administration用户

回答已采纳

发布于 2018-06-22 14:34:08

计划A(不好):

顺便说一下,我认为最理想的方法是先列出=列(S),然后列出范围:

代码语言:javascript
复制
INDEX(status, can_be_closed,   -- in either order
      updatedAt)               -- last

但是..。这比那复杂多了。

代码语言:javascript
复制
'2018...' + INTERVAL interval_before_close ...

本质上是计算日期的函数调用。这使得在索引中添加updatedAtinterval_before_close都是无用的。

计划B(软弱):

所以..。以下内容可能很有用,但只有在不多行与这两个标志匹配的情况下才有用:

代码语言:javascript
复制
INDEX(status, can_be_closed)   -- in either order

烹饪书

计划C(复杂):

另一方面,如果有一个列(实列或计算列)包含

代码语言:javascript
复制
updatedAt - INTERVAL interval_before_close MINUTE

假设它的列名为early_close;然后更改为

代码语言:javascript
复制
AND early_close < '2018-06-22 10:14:36'

再加上

代码语言:javascript
复制
INDEX(status, can_be_closed, early_close)
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/210335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档