导致mySQL服务器实例关闭的DELETE语句?

时间:2012-05-01 14:35:16

标签: mysql sql mysql-workbench

通过持有数月的冗余数据,我正在尝试修剪我的数据库。不幸的是,当我运行我认为会删除不必要的行的查询时,mySQL服务器实例(不是服务器本身)似乎崩溃了。

DELETE w FROM word w WHERE NOT EXISTS(
    SELECT NULL FROM translation t WHERE t.WordID = w.KeyID LIMIT 1
) AND NOT EXISTS (
    SELECT NULL FROM namespace n WHERE n.IdentifierID = w.KeyID  LIMIT 1
)

有没有办法让我的查询更有效率?

编辑#1 SQL Workbench出错:错误代码:1053。服务器正在关闭

编辑#2 以下查询也失败了,表明将表粘合在一起可能会出现问题?

SELECT w.* FROM word w
    LEFT JOIN translation t ON t.WordID = w.KeyID
    LEFT JOIN namespace n ON n.IdentifierID = w.KeyID
WHERE t.TranslationID IS NULL AND n.NamespaceID IS NULL

然后在子查询中使用硬编码值:

SELECT w.* FROM word w WHERE NOT EXISTS(
    SELECT NULL FROM translation t WHERE t.WordID = 1
) AND NOT EXISTS (
    SELECT NULL FROM namespace n WHERE n.IdentifierID = 1
)

编辑#3 包含与表命名空间翻译中的每一行相关联的字词>。换句话说, word 中的一行可能与 namespace translation 表中的一行或多行相关联。这是一种最初被认为可以防止重复数据并提高搜索性能的方法。

通过在命名空间转换表中更新和弃用数据行数月,有些词语已不再使用。我想删除这些单词,这样我就可以释放一些空间并提供更相关的搜索结果。

编辑#4 我开始认为这可能是超时错误?我尝试将查询更改为以下内容:

DELETE FROM word WHERE KeyID NOT IN (
    SELECT WordID FROM translation 
    UNION
    SELECT IdentifierID FROM namespace
)

无济于事。

对于索引,解释会产生以下结果

id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
'1', 'PRIMARY', 'word', 'ALL', NULL, NULL, NULL, NULL, '18430', 'Using where'
'2', 'DEPENDENT SUBQUERY', 'translation', 'ALL', NULL, NULL, NULL, NULL, '28219', 'Using where'
'3', 'DEPENDENT UNION', 'namespace', 'ALL', NULL, NULL, NULL, NULL, '7708', 'Using where'
NULL, 'UNION RESULT', '<union2,3>', 'ALL', NULL, NULL, NULL, NULL, NULL, ''

word KeyID 上的主键和 Key 列上的索引键。

翻译 TranslationID 上的主键和索引键 NamespaceIDKey

namespace NamespaceID

上的主键

编辑#5 虽然它不一定回答我提出的问题,但以下暴力查询解决了我的问题。但是,如果数据库有外键,这种方法显然不会有效,但仍然是:

-- Push all relevant words into a temporary table
CREATE TABLE temp
    SELECT DISTINCT w.* FROM translation t
        INNER JOIN word w ON w.KeyID = t.WordID
    UNION
    SELECT w2.* FROM namespace n2
        INNER JOIN word w2 ON w2.KeyID = n2.IdentifierID;

-- Empty the table
TRUNCATE TABLE word;

-- Re-insert the relevant words
INSERT INTO word            
    SELECT * FROM temp;

2 个答案:

答案 0 :(得分:2)

虽然您已通过解决问题解决了眼前的问题,但您可能已经在其中一个编辑中描述了原因:

  • 您正在加入尚未编入索引的字段。

如果您创建以下两个索引,查询可能会显着加快:

  • Translation(WordID)
  • Namespace(IdentifierID)

如果没有这些索引,MySQL必须遍历整个表以找到匹配项。使用索引MySQL可以在很短的时间内找到匹配。

如果您通过其他任何地方的这些字段加入这些表,则应将它们编入索引。

答案 1 :(得分:1)

  

错误代码:1053。服务器正在关闭

当与MySQL服务器的连接中断时,您可能会收到此错误。它的文字有点误导,因为只有连接被关闭,而不是服务器。

例如,我有cron作业,它会终止长时间运行的SELECT语句以防止服务器过载。当它使用mysql "OK"命令终止连接时,查询也会返回此错误。