【发布时间】:2022-11-02 07:39:10
【问题描述】:
我们有一个包含大约 1000 万条记录的表,我们正在尝试使用 where 子句中的 id(主键)更新一些列。
UPDATE table_name SET column1=1, column2=0,column3='2022-10-30' WHERE id IN(1,2,3,4,5,6,7,......etc);
场景 1:当 IN 子句中有 3000 个或更少的 id 时,如果我尝试 EXPLAIN,则“possible_keys”和“key”显示 PRIMARY,并且查询执行得非常快。
场景 2:当 IN 子句中有 3000 个或更多 id(最多 30K)时,如果我尝试 EXPLAIN,则“possible_keys”显示 NULL,“key”显示 PRIMARY,查询将永远运行。如果我使用 FORCE INDEX(PRIMARY),那么“possible_keys”和“key”会显示 PRIMARY,并且查询执行得非常快。
场景 3:当 IN 子句中有超过 30k 个 id 时,即使我使用 FORCE INDEX(PRIMARY),“possible_keys”显示为 NULL,“key”显示为 PRIMARY,查询将永远运行。
我相信优化器会进行全表扫描而不是索引扫描。我们是否可以进行任何更改以使优化器进行索引扫描而不是表扫描?请建议是否需要更改任何参数来解决此问题。
MySQL版本是5.7
【问题讨论】:
标签: mysql