在连接上使用索引

时间:2010-07-17 10:39:22

标签: sql mysql indexing

使用EXPLAIN进行下面的查询显示

SELECT cha.cid AS cid,
       cha.data AS dl
FROM cha, c_users
WHERE uid = 808
AND cha.cid = c_users.cid;
  1. 它在cha
  2. 上执行完整扫描
  3. 使用cid中的多列索引(uidc_users)。
  4. 为什么不使用cha中的主键索引而是使用全表扫描。有没有更好的方法来优化查询/表。

    编辑: cha.cid是我的主要关键。在下面的评论之后添加。

4 个答案:

答案 0 :(得分:1)

在普通BTREE和(cid,uid)索引上,如果你没有指定cid并且只搜索uid,则需要进行扫描。 (uid,cid)上的索引(注意订单)会/可能会有所帮助。

这绝不是对它的使用保证,如果某个索引/连接最有可能需要使用某个较大百分比的索引,MySQL可以猜测全扫描可能更快(连续读取),和其他原因。您可以使用FORCE INDEX检查是否使用密钥与扫描相比实际上是否更快(在测试之前禁用测试服务器上的查询缓存)。

答案 1 :(得分:0)

为uid列创建索引。

当您询问有关性能的问题时,EXPLAIN和CREATE TABLE语句的输出使帮助程序更容易。请在下次添加。

答案 2 :(得分:0)

由于cha没有covering index可用于此查询,因此无论如何都必须访问数据页以检索所需的一些数据。根据表统计信息,优化器已经确定首次扫描索引然后跳转到数据页的IO时间比仅扫描表更糟糕。

答案 3 :(得分:-1)

岂不...

SELECT cha.cid AS cid,
       cha.data AS dl
    FROM cha INNER JOIN c_users ON cha.cid = c_users.cid
    WHERE uid = 808;

更惯用吗?

(编辑以考虑knittl的评论)。