2

查询一:

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

4 回答 4

1

cid 是否在 c_users 中建立索引?如果不是,您可以保证在这里进行全表扫描(又名“ALL”)。

于 2010-03-01T15:20:45.053 回答
1

我假设您在问哪个查询会更快,然后根据经验,第二个查询会更快。但是对于行数较少的表,差异将是微不足道的。

于 2010-03-02T03:08:53.527 回答
1

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

我会在应用程序级别编写两个 sql,随着您的扩展速度会快得多。

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

于 2010-03-02T05:49:01.470 回答
0

这些查询不相同。

如果 中的给定用户存在2相等的 s ,则第一个查询将返回 1 条记录,而第二个查询将返回两条记录。cidc_userscid

index_subqueryMySQL将测试的表达式推ININ子查询并TRUE在第一个匹配时返回的优化。

第一个查询将始终chal用作前导表,而第二个查询可以选择介于chalc_users最有可能会选择c_users

您应该在c_users (uid, cid).

于 2010-03-01T15:21:05.310 回答