【问题标题】:Mysql does not use indexmysql不使用索引
【发布时间】:2018-08-02 22:50:43
【问题描述】:

我有一个有复合 PK 的表。

CREATE TABLE `tag_value_copy` (
    `tag_id` INT(11) NOT NULL,
    `created_at` INT(11) NOT NULL,
    `value` FLOAT NULL DEFAULT NULL,
    PRIMARY KEY (`tag_id`, `created_at`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT;

当我执行以下查询时

DELETE FROM tag_value_copy WHERE (tag_id, created_at) IN ((1,2), (2,3), ..., (5,6))

mysql 不使用索引并遍历所有行。但为什么呢?


EXPLAIN SELECT * FROM tag_value_copy WHERE (tag_id,created_at) in ((1,1518136666), (2,1518154836)) 也不要使用索引。


UPD 1

show index from tag_value_copy


UPD 2

explain delete from tag_value_copy where (tag_id=1 and created_at=1518103037) or (tag_id=2 and created_at=1518103038)

【问题讨论】:

  • 使用EXPLAIN显示执行计划。
  • 我已经用它更新了我的问题。
  • 我不确定,我什至不能在删除查询中使用“强制索引”。如果我将 delete from ... 更改为 select * from ...。请确保它使用索引。
  • 我无法在使用您的 DDL 创建的表上重现您的声明。 selectdelete 都使用相同的 PK 索引。一定有什么你没有告诉我们的。 tag_id 的基数是多少?您的in 列表中有多少个...

标签: mysql indexing sql-delete


【解决方案1】:

为什么——MySQL 的优化器对优化 (a, b) IN ((1,2), ...) 没有任何作用。

解决方法 -- 创建一个包含要删除的对的表。然后JOIN 在两列之间使用AND

这些都没有帮助:ORFORCE INDEX

为什么你有 PRIMARY KEY (tag_id, created_at) ?您是否允许多次输入相同的标签?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2013-04-07
    • 2013-07-10
    • 2012-12-31
    • 2013-12-07
    相关资源
    最近更新 更多