【问题标题】:Indexing needs to be sped up索引需要加快
【发布时间】:2017-12-11 09:07:04
【问题描述】:

我有一张包含以下详细信息的表格:

CREATE TABLE `test` (
  `seenDate` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
  `corrected_test` varchar(45) DEFAULT NULL,
  `corrected_timestamp` timestamp NULL DEFAULT NULL,
  `unable_to_correct` tinyint(1) DEFAULT '0',
  `fk_zone_for_correction` int(11) DEFAULT NULL,
  PRIMARY KEY (`sightinguid`),
  KEY `corrected_test` (`corrected_test`),
  KEY `idx_seenDate` (`seenDate`),
  KEY `idx_corrected_test_seenDate` (`corrected_test`,`seenDate`),
  KEY `zone_for_correction_fk_idx` (`fk_zone_for_correction`),
  KEY `idx_corrected_test_zone` (`fk_zone_for_correction`,`corrected_test`,`seenDate`),
  CONSTRAINT `zone_for_correction_fk` FOREIGN KEY (`fk_zone_for_correction`) REFERENCES `zone_test` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后我使用以下查询:

SELECT 
    *
FROM
    test
WHERE
    fk_zone_for_correction = 1
        AND (unable_to_correct = 0
        OR unable_to_correct IS NULL)
        AND (corrected_test = ''
        OR corrected_test IS NULL)
        AND (last_accessed_timestamp IS NULL
        OR last_accessed_timestamp < (NOW() - INTERVAL 30 MINUTE))
        ORDER BY seenDate ASC
LIMIT 1

这是优化器的屏幕截图 - ORDER BY 正在减慢速度,在我看来似乎已正确编入索引,并且正在选择正确的索引 (idx_corrected_test_zone)。可以做些什么来改进它?

【问题讨论】:

标签: mysql sql database indexing query-optimization


【解决方案1】:

没有任何索引可以提供很大帮助。

可能有帮助:

INDEX(fk_zone_for_correction, seenDate)

也许可以使用两列——第一列用于过滤,第二列用于避免排序。但是,如果它不能快速找到1 行,它可能会适得其反。

凶手是OR。如果您可以避免使用NULL 填充这三列中的任何一列,那么这可能会更好:

INDEX(fk_zone_for_correction, unable_to_correct, corrected_test, last_accessed_timestamp)
-- the range thing needs to be last
-- this index would do the filtering, but fail to help with `ORDER` and `LIMIT`.

即使它使用的是idx_corrected_test_zone,它也可能不会使用超过前两列的内容——因为OR

您有两种冗余索引。例如,第一个是第二个的 left 部分;所以第一个是多余的,可以是DROPped:

KEY `corrected_test`              (`corrected_test`),
KEY `idx_corrected_test_seenDate` (`corrected_test`,`seenDate`),

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 2013-10-13
    • 2016-07-21
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多