Mysql查询优化
问题1:Mysql查询优化,mysql,optimization,explain,Mysql,Optimization,Explain,问题1: SELECT cid, dl FROM chal WHERE cid IN ( SELECT cid FROM c_users WHERE uid = 636587 ); 问题2: SELECT chal.cid AS cid, chal.dl AS dl FROM chal, c_users WHERE uid = 808
SELECT cid,
dl
FROM chal
WHERE cid IN (
SELECT cid
FROM c_users
WHERE uid = 636587
);
问题2:
SELECT chal.cid AS cid,
chal.dl AS dl
FROM chal,
c_users
WHERE uid = 808
AND chal.cid = c_users.cid;
cid是chal中的主键
cid和uid在c_用户中被索引,cid不是唯一的
以上哪个查询更好
解释如下
- 查询1使用两种类型的索引,即ALL和index_子查询
- 向2个用户查询两种类型的索引,即ALL和ref
我想知道,尽管cid是表chal中的主键,但为什么两个查询都将ALL表示为索引类型 是否在c_用户中索引cid?如果不是,则保证在此处进行完整的表扫描(也称为“ALL”)。这些查询不完全相同 如果在
c_users
中有一个给定用户的2
equalcid
s,第一个查询将为每个cid
返回一条记录,而第二个查询将返回两条记录
index\u子查询
是MySQL
中的优化,它将使用in
测试的表达式推送到in
子查询中,并在第一次匹配时返回TRUE
第一个查询将始终使用chal
作为前导表,而第二个查询可以在chal
和c_用户
之间进行选择,并且很可能会选择c_用户
您应该在
c_用户(uid,cid)
上创建一个复合索引。我假设您询问的是哪个查询会更快,那么根据经验,第二个查询会更快。但是,对于行数较少的表来说,差异是微不足道的。我不会使用联接或嵌套选择
我将在应用程序级别编写两个sql,这将随着您的扩展而加快
您的选择应该基于两个表上的主键。i、 cid在c_用户和chal中都有索引