Mysql查询优化

时间:2010-03-01 15:12:36

标签: 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
        AND    chal.cid = c_users.cid;

cid是chal中的主键 cid和uid在c_users中编入索引,cid不是唯一的;

以上哪个查询更好?

解释说以下

  • 查询1使用两种类型的索引,即ALL和index_subquery

  • 查询2个用户的两种索引即ALL和ref

我想知道为什么两个查询都将ALL称为索引类型,尽管cid是表chal中的主键。

4 个答案:

答案 0 :(得分:1)

cid是否在c_users中编入索引?如果不是,那么你可以保证在这里进行全表扫描(也就是“全部”)。

答案 1 :(得分:1)

我假设你问的是哪个查询会更快,那么根据经验,第二个查询会更快。但对于行数较少的表,差异无关紧要。

答案 2 :(得分:1)

我不会使用连接或嵌套选择。

我会在应用程序级别编写两个sql,当你扩展时会更快。

并且您的选择应基于两个表上的主键。即cid

答案 3 :(得分:0)

这些查询不完全相同。

如果2中的给定用户cid等于c_users,则第一个查询将返回每cid个1个记录,而第二个将返回两个index_subquery记录。

MySQLIN中的优化,它将使用IN测试的表达式推送到TRUE子查询中,并在第一次匹配时返回chal

第一个查询将始终使用chal作为排行榜,而第二个查询可以选择c_usersc_users,最有可能选择c_users (uid, cid)

您应该在{{1}}上创建综合索引。