2010-03-01 94 views
2

查询1:MySQL查询优化

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和裁判

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

回答

0

这些查询不完全相同。

如果有2等于cid S表示在c_users给定用户,第一个查询将返回1个记录每cid,而第二个将返回两个记录。

index_subqueryMySQL是推动与IN测试的表达到IN子查询和第一匹配返回TRUE优化。

第一个查询将始终使用chal作为主表,而第二个查询可以选择chalc_users之间,最有可能会选择c_users

您应该在c_users (uid, cid)上创建一个复合索引。

1

c_users中的cid是否已编入索引?如果不是的话,你可以在这里保证全表扫描(又称“全部”)。

+0

cid在c_users和chal中都被索引 –

1

我假设你问哪个查询会更快,那么作为经验法则,第二个查询将会更快。但是,对于行数较少的表格来说,这种差异是微不足道的。

1

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

我会在应用程序级别编写两个sql,这会在您缩放时更快。

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