2010-05-27 53 views
8

我必须根据一些标准从具有超过1亿行的表中删除大约10K行。当我执行查询时,大约需要5分钟。我运行了一个解释计划(delete查询转换为select *,因为MySQL不支持explain delete),并发现MySQL使用了错误的索引。MySQL,删除和索引提示

我的问题是:有什么办法告诉MySQL在删除过程中使用哪个索引?如果不是,我该怎么办?选择临时表,然后从临时表中删除?

+0

确保您有主键,并且删除的WHERE子句中指定的列已建立索引。 – 2010-05-27 21:03:37

回答

4

index hint syntax//ETA: sadly, not for deletes

ETA: 您是否尝试过运行ANALYZE TABLE $mytable

如果这还没有回报,我认为你有2个选择:在删除之前删除违规索引,然后重新创建它。或者将您的删除表联接到所需索引上的另一个表,以确保使用所需的索引。

+1

是的,但据我了解,索引提示不适用于删除语句。 – 2010-05-28 02:17:38

+0

@Manuel Darveau:Drat!只是测试它。你是对的。 – dnagirl 2010-05-28 11:59:09

2

我从来没有真正遇到MySQL选择错误索引的情况,而是我对索引如何工作的理解通常是错误的。

你可能想看看这本书:http://oreilly.com/catalog/9780596003067

它有索引是如何工作的,一个伟大的部分其他调节选项。

+0

+1,这本书让你看到许多你永远不会想到的东西。 – newtover 2010-05-27 20:57:56

+0

编辑,dnagirl关于索引提示语法是正确的,我不知道那是上线。 – UltimateBrent 2010-05-27 21:11:42

+0

我见过mysql多次选择错误的索引。对我们来说,它发生在一个有大量类似索引(15个索引)的大型表格(15M行)上。也许是一个疯狂的场景---有一个原因---并且经常会得到错误的索引,即使选择的inde应该是PRIMARY也是如此。 – 2016-11-02 01:30:46