【发布时间】:2016-01-23 23:41:18
【问题描述】:
我的数据库存储游戏中的项目列表以及有关它们的相关信息。
主项目表包含所有只能有单个条目的字段,例如重量、简短描述等。
可能是一组值的字段由具有 2 个字段、项目 ID 和属性 ID 的表表示,例如允许使用该项目的种族列表或可能佩戴该项目的地点列表.在连接中导致大量额外行的是与项目关联的影响列表和影响的值(例如:影响 allowed_carrying_weight 10 或影响生命值 20 或两者都不影响或两者兼而有之)。
其中一些通过使用位域以编程方式存储在 1 个字段中,例如,每个种族都有一个数字,如果允许种族使用该项目,则将设置 AllowedRaceInteger & 2^(raceNumber)。
例如,背包可以拿在手中或背在背上。也许这个特殊的背包可能只有人类和精灵才能使用。
SELECT DISTINCT i.id, iwt.wearlocID, i.sdesc, i.wearProg, i.isOOG, i.minLvl, i.maxLvl,
iaft.affectID, iaft.amount, NULL AS affectbyID FROM item i
INNER JOIN itemwearTable iwt ON i.id=iwt.itemID
LEFT JOIN itemaffectTable iaft ON i.id=iaft.itemID
WHERE iwt.wearlocID >= 1 AND iwt.wearlocID <= 22 AND i.minlvl <= 50
UNION
SELECT DISTINCT i.id, iwt.wearlocID, i.sdesc, i.wearProg, i.isOOG, i.minLvl, i.maxLvl,
NULL AS affectID, NULL AS amount, iafbt.affectbyID FROM item i
INNER JOIN itemwearTable iwt ON i.id=iwt.itemID
LEFT JOIN itemaffectedbyTable iafbt ON i.id=iafbt.itemID
WHERE iwt.wearlocID >= 1 AND iwt.wearlocID <= 22 AND i.minlvl <= 50
ORDER BY wearlocID, sdesc,id
即使在非常小的数据集上,此查询也可能需要 7-10 秒才能执行。我设置的唯一索引是 item.id。我可以使用什么标准来决定是否应该对事物进行索引?例如,是否应该为我的表中将项目与值相关联的所有值编入索引,否则会产生新问题吗?
这一切都可以通过位域编码来简化吗?我不认为它可以,因为它需要沿着 select * 从某处 wheresomewhere.field & 256 == 1 ..
谢谢
【问题讨论】:
标签: sql join database-performance