WHERE IN 查询是否在查询中的每个集合之后重新索引表?

Sha*_*aun 3 mysql performance index where query-performance

我有一个基本的 WHERE IN 查询需要很长时间(30 秒以上)来处理。

DELETE FROM `table1`
WHERE ( djID, localID )
IN (("128","26"),("110","32"))
Run Code Online (Sandbox Code Playgroud)

我正在查询的表有大约 2000 万行,有两个索引 - 第一个是名为 ID 的自动递增的 PK,第二个索引超过两列 - djIDlocalID

我想知道 MySQL 是否在查询中的每个 ( djID, localID ) 之后重新索引表,因此考虑了很长的查询时间,如果是这样,有没有办法强制它等到所有 ( djID, localID ) ) 在重新索引之前已在查询中执行了集合?

还是有其他原因跳出可能导致查询时间过长?

Ric*_*mes 6

  1. 没有SELECT原因重新索引。只有ALTEROPTIMIZE和其他一些命令可能会导致重新索引。

  2. 构造 (a,b) IN ((1,2), (3,4)) 没有得到很好的优化。

所以,...把它变成两个DELETEs,比如

DELETE FROM `table1`
    WHERE djID = 128
      AND localID = 26;
Run Code Online (Sandbox Code Playgroud)

如果你有很多,你可以用成对的数字建立一个 tmp 表,然后做一个多表DELETE

为了证明它做的工作比它应该做的要多得多,

FLUSH STATUS;
DELETE ... WHERE ... IN ...;
SHOW SESSION STATUS LIKE 'Handler%';
Run Code Online (Sandbox Code Playgroud)

您可能会看到一些大约 20M(或者可能是 40M)的数字,这表明尽管有索引,它还是进行了表扫描。

然后向http://bugs.mysql.com提交错误(除非已经有错误)。