我必须根据一些标准从具有超过1亿行的表中删除大约10K行。当我执行查询时,大约需要5分钟。我运行了一个解释计划(delete
查询转换为select *
,因为MySQL不支持explain delete
),并发现MySQL使用了错误的索引。MySQL,删除和索引提示
我的问题是:有什么办法告诉MySQL在删除过程中使用哪个索引?如果不是,我该怎么办?选择临时表,然后从临时表中删除?
我必须根据一些标准从具有超过1亿行的表中删除大约10K行。当我执行查询时,大约需要5分钟。我运行了一个解释计划(delete
查询转换为select *
,因为MySQL不支持explain delete
),并发现MySQL使用了错误的索引。MySQL,删除和索引提示
我的问题是:有什么办法告诉MySQL在删除过程中使用哪个索引?如果不是,我该怎么办?选择临时表,然后从临时表中删除?
有index hint syntax。 //ETA: sadly, not for deletes
ETA: 您是否尝试过运行ANALYZE TABLE $mytable
?
如果这还没有回报,我认为你有2个选择:在删除之前删除违规索引,然后重新创建它。或者将您的删除表联接到所需索引上的另一个表,以确保使用所需的索引。
是的,但据我了解,索引提示不适用于删除语句。 – 2010-05-28 02:17:38
@Manuel Darveau:Drat!只是测试它。你是对的。 – dnagirl 2010-05-28 11:59:09
我从来没有真正遇到MySQL选择错误索引的情况,而是我对索引如何工作的理解通常是错误的。
你可能想看看这本书:http://oreilly.com/catalog/9780596003067
它有索引是如何工作的,一个伟大的部分其他调节选项。
+1,这本书让你看到许多你永远不会想到的东西。 – newtover 2010-05-27 20:57:56
编辑,dnagirl关于索引提示语法是正确的,我不知道那是上线。 – UltimateBrent 2010-05-27 21:11:42
我见过mysql多次选择错误的索引。对我们来说,它发生在一个有大量类似索引(15个索引)的大型表格(15M行)上。也许是一个疯狂的场景---有一个原因---并且经常会得到错误的索引,即使选择的inde应该是PRIMARY也是如此。 – 2016-11-02 01:30:46
确保您有主键,并且删除的WHERE子句中指定的列已建立索引。 – 2010-05-27 21:03:37