我有这段简短的代码片段
SELECT candidate.ID
FROM users u
JOIN users candidate ON candidate.a = u.a AND candidate.b < 1
JOIN user_meta meta ON candidate.id = meta.user_id
WHERE u.id = 1
AND candidate.count > 0
ORDER BY meta.updated_at DESC
LIMIT 100
它在8s左右结束,我认为这很慢,所以我开始调查了一下。我尝试了加入条件
SELECT candidate.ID
FROM users u
JOIN users candidate ON candidate.a = u.a AND candidate.b < 2
JOIN user_meta meta ON candidate.id = meta.user_id
WHERE u.id = 1
AND candidate.count > 0
ORDER BY meta.updated_at DESC
LIMIT 100
并且有趣的是它在~80ms内完成。唯一改变的是小于1到小于2.
对查询运行EXPLAIN会为两个查询生成以下内容
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE u const PRIMARY,index_a PRIMARY 4 const 1 NULL
1 SIMPLE meta index PRIMARY index_meta_on_updated_at 5 NULL 100 Using index
1 SIMPLE candidate eq_ref PRIMARY,index_a PRIMARY 4 db.meta.user_id 1 Using where
可能是我错过了什么但可能导致这种行为的原因?
答案 0 :(得分:0)
您能否提供更多有关以下内容的信息: - 表(你可以用describe) - 每张桌子有多少条记录 - 表格是否有索引?
对于故障排除,您可以在MySQL中使用像Mjh那样的解释扩展告诉您。向我们提供每个查询的说明,这将有助于我们为您提供更好的建议,甚至可以帮助您更好地进行查询。