Mysql optomise超大表查询

Mysql optomise超大表查询,mysql,innodb,primary-key-design,Mysql,Innodb,Primary Key Design,我有一张近2000万条记录的表格,而且还在增长。该表被设置为innodb。两个主要字段上有一个主索引: `entries_to_fields` entry_id int(11) NO PRI NULL field_id int(11) NO PRI NULL value text NO NULL 尽管记录数量众多,但对该表的大多数查询都异常快速,以下情况除外: DELETE FROM `entries_to_fields` WH

我有一张近2000万条记录的表格,而且还在增长。该表被设置为innodb。两个主要字段上有一个主索引:

`entries_to_fields`
entry_id    int(11) NO  PRI NULL     
field_id    int(11) NO  PRI NULL     
value   text    NO      NULL     
尽管记录数量众多,但对该表的大多数查询都异常快速,以下情况除外:

DELETE FROM `entries_to_fields` WHERE `entry_id` IN (SELECT `id` FROM `entries` WHERE `form_id` = 196)
这将删除特定表单的所有条目数据

目前,即使entries表没有返回任何结果,这也需要45秒以上的时间


我的问题是,我可以对
条目到字段
的结构做一个简单的更改吗,或者我可以进一步优化我的查询。

经过一点尝试&错误+谷歌搜索后,我发现在大型表的索引字段上使用

我将子查询分解为一个单独的查询,然后创建了一个动态查询,如下所示:

DELETE FROM `entries_to_fields` WHERE `entry_id` = 232 OR `entry_id` = 342 ...

尽管生成了一个潜在的大型查询,但它现在可以在~1秒内执行。即使删除1000个条目。

经过一点尝试&错误+谷歌搜索,我发现在大型表的索引字段上使用
中的
是一种非常糟糕的做法

我将子查询分解为一个单独的查询,然后创建了一个动态查询,如下所示:

DELETE FROM `entries_to_fields` WHERE `entry_id` = 232 OR `entry_id` = 342 ...

尽管生成了一个潜在的大型查询,但它现在可以在~1秒内执行。即使在删除1000条条目时。

在我阅读了您的答案后,我写下了这个查询,这可能也会对您有所帮助(将来)


。。。entries.form_id字段应该被索引。

在我阅读了您的答案后,我写了这个查询,它可能也会对您有所帮助(将来)


。。。entries.form_id字段应编入索引。

我会查看查询计划,我猜子查询将返回NULL并进行完全删除扫描

见:


我将查看查询计划,我猜子查询将返回NULL并进行完全删除扫描

见:


谢谢!我不知道删除中可能有内部联接。。每天学习新的东西!谢谢我不知道删除中可能有内部联接。。每天学习新的东西!