索引停止工作,如果我有一些多个或对,例如((id = 5和test_date ='2019-01-17 05:56:19.0'((
sql在哪里有限制?SQL Optimizer决定使用完整的扫描?数据库查询设置限制?
我可以将SQL分为小调。
EXPLAIN
UPDATE TEST_TABLE
SET MY_FLAG=1
WHERE (ID = 1 AND TEST_DATE = '2019-01-15 01:24:01.0') ||
(ID = 2 AND TEST_DATE = '2019-01-15 02:14:02.0') ||
(ID = 3 AND TEST_DATE = '2019-01-16 03:32:08.0') ||
(ID = 4 AND TEST_DATE = '2019-01-16 04:45:19.0') ||
(ID = 5 AND TEST_DATE = '2019-01-17 05:56:19.0')
解释结果1:或对> 200
(1, 'SIMPLE', 'TEST_TABLE', 'range', 'PRIMARY,test_date_index', 'PRIMARY', '8', NULL, 316, 'Using where');
解释结果2:或对> 300
(1, 'SIMPLE', 'TEST_TABLE', 'index', NULL, 'PRIMARY', '8', NULL, 51425278, 'Using where');
表格:
CREATE TABLE `TEST_TABLE` (
`ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
`ATTR_ADDRESS` VARCHAR(255) NULL DEFAULT NULL,
`ATTR_CITY` VARCHAR(40) NULL DEFAULT NULL,
`ATTR_COUNTRY` VARCHAR(40) NULL DEFAULT NULL,
`TEST_DATE` DATETIME NOT NULL,
`MY_FLAG` BIT(1) NOT NULL DEFAULT b'0',
PRIMARY KEY (`ID`),
INDEX `test_date_index` (`TEST_DATE`),
INDEX `MY_FLAG` (`MY_FLAG`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
优化器没有足够的信息来确定哪种方法更好地执行查询。如果您发现200是"更快"执行的安全限制,则是块。也就是说,一次只做200行。
另外,您可以尝试将ID,日期对放在另一个表中,然后进行"多桌子UPDATE
"。 May 运行速度更快。在test_table
中包括"复合" INDEX(test_date, id)
。