我有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为scripts
,objectid
ID为npc_data
。
此查询执行大约需要5秒钟,我不知道为什么。这是所有这3个表的CREATE语句,也许我错过了什么?
npcid
答案 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)
map_life.lifeid
没有定义任何索引,因此连接将导致全表扫描。在map_life.lifeid
字段上定义索引。
在脚本表中,主键按以下顺序定义:script_type
,helper
,objectid
。联接在objectid
上完成,script_type
上有一个常量过滤条件。由于索引中字段的顺序错误,因此MySQL无法使用主键进行此查询。对于此查询,索引中字段的顺序应为b:objectid
,script_type
,helper
。
以上将显着加快连接速度。如果索引实际覆盖了查询中的所有字段,则可以进一步提高查询速度,因为在这种情况下,MySQL甚至不必触及表。
考虑添加一个带有以下字段的索引,并命令scripts
表:object_id, script_type, script
和npcid, storage_cost
索引到npc_data
表。但是,这些索引可能会降低插入/更新/删除语句的速度,因此在将这些索引添加到生产环境之前,请执行一些性能测试。