有趣的mysql 5.6行为

时间:2017-08-07 13:01:49

标签: mysql sql database-performance

我有这段简短的代码片段

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

可能是我错过了什么但可能导致这种行为的原因?

1 个答案:

答案 0 :(得分:0)

您能否提供更多有关以下内容的信息:   - 表(你可以用describe)   - 每张桌子有多少条记录   - 表格是否有索引?

对于故障排除,您可以在MySQL中使用像Mjh那样的解释扩展告诉您。向我们提供每个查询的说明,这将有助于我们为您提供更好的建议,甚至可以帮助您更好地进行查询。