查询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
AND chal.cid = c_users.cid;
cid是chal中的主键 cid和uid在c_users中编入索引,cid不是唯一的;
以上哪个查询更好?
解释说以下
查询1使用两种类型的索引,即ALL和index_subquery
查询2个用户的两种索引即ALL和ref
我想知道为什么两个查询都将ALL称为索引类型,尽管cid是表chal中的主键。
答案 0 :(得分:1)
cid是否在c_users中编入索引?如果不是,那么你可以保证在这里进行全表扫描(也就是“全部”)。
答案 1 :(得分:1)
我假设你问的是哪个查询会更快,那么根据经验,第二个查询会更快。但对于行数较少的表,差异无关紧要。
答案 2 :(得分:1)
我不会使用连接或嵌套选择。
我会在应用程序级别编写两个sql,当你扩展时会更快。
并且您的选择应基于两个表上的主键。即cid
答案 3 :(得分:0)
这些查询不完全相同。
如果2
中的给定用户cid
等于c_users
,则第一个查询将返回每cid
个1个记录,而第二个将返回两个index_subquery
记录。
MySQL
是IN
中的优化,它将使用IN
测试的表达式推送到TRUE
子查询中,并在第一次匹配时返回chal
。
第一个查询将始终使用chal
作为排行榜,而第二个查询可以选择c_users
和c_users
,最有可能选择c_users (uid, cid)
。
您应该在{{1}}上创建综合索引。