具有多个连接的MySQL查询执行时间过长

时间:2017-04-26 15:49:05

标签: mysql sql

我有3张桌子。第一个称为map_life,第二个称为scripts,第三个称为npc_data

我正在运行以下查询以获取map_life的所有属性,同时获取script的{​​{1}}列以及scripts列中的storage_cost列如果ids匹配。

npc_data

如您所见,SELECT life.* , script.script , npc.storage_cost FROM map_life life LEFT JOIN scripts script ON script.objectid = life.lifeid AND script.script_type = 'npc' LEFT JOIN npc_data npc ON npc.npcid = life.lifeid ID为map_life,而lifeid ID为scriptsobjectid ID为npc_data

此查询执行大约需要5秒钟,我不知道为什么。这是所有这3个表的CREATE语句,也许我错过了什么?

npcid

2 个答案:

答案 0 :(得分:0)

对于此查询:

SELECT l.*, s.script, npc.storage_cost 
FROM map_life l LEFT JOIN
     scripts s 
     ON s.objectid = l.lifeid AND
        s.script_type = 'npc' LEFT JOIN
     npc_data npc 
     ON npc.npcid = l.lifeid;

您想要索引:scripts(object_id, script_type, script)npc_data(npcid, storage_cost)。这些索引中列的顺序很重要。

答案 1 :(得分:0)

  1. map_life.lifeid没有定义任何索引,因此连接将导致全表扫描。在map_life.lifeid字段上定义索引。

  2. 在脚本表中,主键按以下顺序定义:script_typehelperobjectid。联接在objectid上完成,script_type上有一个常量过滤条件。由于索引中字段的顺序错误,因此MySQL无法使用主键进行此查询。对于此查询,索引中字段的顺序应为b:objectidscript_typehelper

  3. 以上将显着加快连接速度。如果索引实际覆盖了查询中的所有字段,则可以进一步提高查询速度,因为在这种情况下,MySQL甚至不必触及表。

    考虑添加一个带有以下字段的索引,并命令scripts表:object_id, script_type, scriptnpcid, storage_cost索引到npc_data表。但是,这些索引可能会降低插入/更新/删除语句的速度,因此在将这些索引添加到生产环境之前,请执行一些性能测试。