Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在连接上使用索引_Sql_Mysql_Indexing - Fatal编程技术网

Sql 在连接上使用索引

Sql 在连接上使用索引,sql,mysql,indexing,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; 它对cha表进行完整扫描 使用c_用户的多列索引ID、uid。 为什么它不使用cha中的主键索引,而是进行完整的表扫描。是否有更好的方法优化查询/表 编辑: cha.cid是我的主键。在下面的评论之后添加。不会 SELECT cha.cid AS

在下面的查询中使用EXPLAIN显示

SELECT cha.cid AS cid,
       cha.data AS dl
FROM cha, c_users
WHERE uid = 808
AND cha.cid = c_users.cid;
它对cha表进行完整扫描 使用c_用户的多列索引ID、uid。 为什么它不使用cha中的主键索引,而是进行完整的表扫描。是否有更好的方法优化查询/表

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

不会

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的评论。

为uid列创建索引


当您询问有关性能的问题时,EXPLAIN和CREATETABLE语句的输出使帮助者的工作更轻松。请下次添加它们。

在一个普通的B树中,如果不指定cid,只搜索uid,则需要扫描cid、uid索引。uid、cid上的索引请注意,该命令将/可能有帮助


这并不能保证它会被使用,MySQL可以猜测,如果某个索引/连接很可能需要使用某个很大比例的索引以及其他原因,那么完整扫描可能会更快地进行连续读取。在测试之前,您可以使用FORCE INDEX检查与扫描相比,使用密钥是否实际上更快,或者是否在testserver上禁用查询缓存。

由于cha没有用于此查询的可用密钥,因此它必须访问数据页以检索它所需的一些数据。根据表格统计,,优化器已经决定,首先扫描索引然后跳转到数据页的IO时间比只扫描表更糟糕。

cha.cid是您的主键吗?是的cha.cid是主键我发现将其拆分为两个查询并创建适当的索引更好语法来自表1内部联接表2在…上,与作为b树无关-覆盖索引需要按照定义的顺序匹配最左边的列。如果第一个不匹配,则不会考虑索引。我的缺点是,将其与标准的2整数空间索引技巧RTREE混淆,这当然与手头的问题无关,这只是个人的脑残,仍然需要两个整数都有某种界限。为我辩护:这里已经很晚了;我已经描述了EXPLAIN的输出。你需要更多的信息吗?