使用EXPLAIN进行下面的查询显示
SELECT cha.cid AS cid,
cha.data AS dl
FROM cha, c_users
WHERE uid = 808
AND cha.cid = c_users.cid;
cha
表cid
中的多列索引(uid
,c_users
)。为什么不使用cha
中的主键索引而是使用全表扫描。有没有更好的方法来优化查询/表。
编辑: cha.cid是我的主要关键。在下面的评论之后添加。
答案 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的评论)。