MySQL、删除和索引提示

MySQL、删除和索引提示,mysql,query-optimization,sql-delete,sql-execution-plan,Mysql,Query Optimization,Sql Delete,Sql Execution Plan,根据某些标准,我必须从一个有1亿多行的表中删除大约10K行。当我执行查询时,大约需要5分钟。我运行了一个解释计划,将delete查询转换为select*,因为MySQL不支持explain delete,并且发现MySQL使用了错误的索引 我的问题是:有没有办法告诉MySQL在删除过程中使用哪个索引?如果没有,我该怎么办?选择临时表,然后从临时表中删除?有//埃塔:遗憾的是,这不是为了你 预计到达时间: 你试过跑步吗 如果这样做没有效果,我想你有两个选择:在删除之前删除有问题的索引,然后重新创建

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

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

有//埃塔:遗憾的是,这不是为了你

预计到达时间: 你试过跑步吗


如果这样做没有效果,我想你有两个选择:在删除之前删除有问题的索引,然后重新创建。或者将您的delete表连接到所需索引上的另一个表,这将确保使用所需的索引。

我从未真正遇到过MySQL选择错误索引的情况,但我对索引如何工作的理解通常是错误的

您可能想看看这本书:


它有一个关于索引如何工作和其他调优选项的重要部分。

正如其他答案中所述,MySQL不能使用索引,而是使用主键索引

因此,如果表上有主键,最好的选择是运行快速选择,然后根据行删除。最好是在事务中,这样就不会删除错误的行

因此:

从表中删除,其中列_的索引为0

将重写:

从表中选择主\u键,其中带有\u index=0=>的列\u返回许多行

从主键在?,,?=>中的表中删除?将由选定主键的结果替换

如果没有那么多行要删除,那么这种方式会更有效

例如,我刚刚在同一张表上找到了一个示例,使用了相同的数据:

7499067行被删除分析:12秒 vs

使用良好索引选择分析的6行:0.10秒 最后要删除的0行
+1,这本书让你看到了很多你从未想过的事情。编辑,dnagirl关于索引提示语法是正确的,我不知道它已经上线了。我多次看到mysql选择了错误的索引。对我们来说,它发生在一个有15行的大型表上,该表有很多相似的索引15个索引。也许一个疯狂的场景是有原因的,它经常得到错误的索引,即使要选择的索引应该是主要的。很难相信从“我从未真正遇到过MySQL选择错误索引的情况”开始的答案。这不是一个罕见的问题。对于具有数百万行的数据库的数据库管理员来说,这是一个日常问题。请确保您有一个主键,并且在delete的WHERE子句中命名的列已编制索引。是的,但据我所知,索引提示不适用于delete语句。