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,第二个索引超过两列 - djID,localID
我想知道 MySQL 是否在查询中的每个 ( djID, localID ) 之后重新索引表,因此考虑了很长的查询时间,如果是这样,有没有办法强制它等到所有 ( djID, localID ) ) 在重新索引之前已在查询中执行了集合?
还是有其他原因跳出可能导致查询时间过长?
没有SELECT原因重新索引。只有ALTER、OPTIMIZE和其他一些命令可能会导致重新索引。
构造 (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提交错误(除非已经有错误)。
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |