我不知道';我不理解两个查询在解释输出方面的差异。唯一的区别是MYSQL中的左连接与内连接
这两个查询是相同的,除了左连接和内连接。请注意,左侧连接中的解释提到了查询中根本没有使用的列的键:megastore我不知道';我不理解两个查询在解释输出方面的差异。唯一的区别是MYSQL中的左连接与内连接,mysql,Mysql,这两个查询是相同的,除了左连接和内连接。请注意,左侧连接中的解释提到了查询中根本没有使用的列的键:megastore EXPLAIN SELECT m.imdbid , uma.multiplier from movies m LEFT JOIN ur_movie_actors uma ON uma.imdbid = m.imdbid AND uma.user_uuid = '11e9'; +----+-------------+-------+
EXPLAIN
SELECT m.imdbid
, uma.multiplier
from movies m
LEFT
JOIN ur_movie_actors uma
ON uma.imdbid = m.imdbid
AND uma.user_uuid = '11e9';
+----+-------------+-------+------------+-------+-----------------------+-----------+---------+------+--------+----------+----------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+-----------------------+-----------+---------+------+--------+----------+----------------------------------------------------+
| 1 | SIMPLE | m | NULL | index | NULL | metascore | 3 | NULL | 106764 | 100.00 | Using index |
| 1 | SIMPLE | uma | NULL | ALL | user_uuid,user_imdbid | NULL | NULL | NULL | 24750 | 50.00 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+-------+------------+-------+-----------------------+-----------+---------+------+--------+----------+----------------------------------------------------+
EXPLAIN
SELECT m.imdbid
, uma.multiplier
from movies m
JOIN ur_movie_actors uma
ON uma.imdbid = m.imdbid
AND uma.user_uuid = '11e9';
+----+-------------+-------+------------+--------+-----------------------+-----------+---------+-------+-------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+-----------------------+-----------+---------+-------+-------+----------+--------------------------+
| 1 | SIMPLE | uma | NULL | ref | user_uuid,user_imdbid | user_uuid | 38 | const | 12375 | 100.00 | NULL |
| 1 | SIMPLE | m | NULL | eq_ref | PRIMARY,imdbID | PRIMARY | 29 | func | 1 | 100.00 | Using where; Using index |
+----+-------------+-------+------------+--------+-----------------------+-----------+---------+-------+-------+----------+--------------------------+
我不明白这里发生了什么,除了可能是数据库损坏?这是一个根本区别必须为两个表提供完整的创建表脚本。此外,还必须提供表统计信息(总行数、与每个单独条件和每个条件组合匹配的行数)。请记住-当筛选行数超过约5-7%时,表扫描比索引使用更合适。
左连接
和内部连接
是不同的事情。正如您在对第一个问题的评论中所指出的,“无论是否有电影收视率记录,我都要添加每个电影记录。”。因此,对于左连接,MySQL必须读取每个电影记录,无论是否有电影分级记录,这并不奇怪。对于内部联接,它不是。这是a)为什么您选择了左连接b)为什么MySQL不必以相同的方式执行查询c)为什么您得到不同的结果以及d)为什么解释输出不同。既然你已经两次提到数据库损坏,那就不是了,谢谢!还有一个问题。有人能解释为什么第一个查询的键显示“metascore”列,即使SELECT语句中没有提到该列,并且其他列(如imdbID)也被提到并被索引?