Mysql查询优化

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

问题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_用户中被索引,cid不是唯一的

以上哪个查询更好

解释如下

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

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


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

是否在c_用户中索引cid?如果不是,则保证在此处进行完整的表扫描(也称为“ALL”)。

这些查询不完全相同

如果在
c_users
中有一个给定用户的
2
equal
cid
s,第一个查询将为每个
cid
返回一条记录,而第二个查询将返回两条记录

index\u子查询
MySQL
中的优化,它将使用
in
测试的表达式推送到
in
子查询中,并在第一次匹配时返回
TRUE

第一个查询将始终使用
chal
作为前导表,而第二个查询可以在
chal
c_用户
之间进行选择,并且很可能会选择
c_用户


您应该在
c_用户(uid,cid)
上创建一个复合索引。我假设您询问的是哪个查询会更快,那么根据经验,第二个查询会更快。但是,对于行数较少的表来说,差异是微不足道的。

我不会使用联接或嵌套选择

我将在应用程序级别编写两个sql,这将随着您的扩展而加快


您的选择应该基于两个表上的主键。i、 cid在c_用户和chal中都有索引