Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL更新,其中条件限制(索引停止工作)_Mysql_Indexing_Mariadb_Where Clause - Fatal编程技术网

Mysql SQL更新,其中条件限制(索引停止工作)

Mysql SQL更新,其中条件限制(索引停止工作),mysql,indexing,mariadb,where-clause,Mysql,Indexing,Mariadb,Where Clause,如果我有多个或多个对,索引将停止工作,如((ID=5,TEST_DATE='2019-01-17 05:56:19.0')) SQL Where子句有限制吗?SQL优化器决定使用完全扫描? 数据库查询设置限制 我可以将sql拆分为小型和平 EXPLAIN UPDATE TEST_TABLE SET MY_FLAG=1 WHERE (ID = 1 AND TEST_DATE = '2019-01-15 01:24:01.0') || (I

如果我有多个或多个对,索引将停止工作,如((ID=5,TEST_DATE='2019-01-17 05:56:19.0'))

SQL Where子句有限制吗?SQL优化器决定使用完全扫描? 数据库查询设置限制

我可以将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、日期对放在另一个表中,然后执行“多表更新”。它可能跑得更快。在
test\u表中包含“composite”
索引(test\u date,id)

您在(id,test\u date)上有索引?是的主要id和次要test\u date\u索引。表是InnoDB吗?是的,InnoDB。目前的数据库是MariaDB 10.0.x。在这种情况下,我看不到任何进一步的优化空间,但希望其他人能够提出一些建议。