Mysql optomise超大表查询
我有一张近2000万条记录的表格,而且还在增长。该表被设置为innodb。两个主要字段上有一个主索引: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
`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并进行完全删除扫描
见:
谢谢!我不知道删除中可能有内部联接。。每天学习新的东西!谢谢我不知道删除中可能有内部联接。。每天学习新的东西!