我不知道';我不理解两个查询在解释输出方面的差异。唯一的区别是MYSQL中的左连接与内连接

我不知道';我不理解两个查询在解释输出方面的差异。唯一的区别是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'; +----+-------------+-------+

这两个查询是相同的,除了左连接和内连接。请注意,左侧连接中的解释提到了查询中根本没有使用的列的键: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';

+----+-------------+-------+------------+-------+-----------------------+-----------+---------+------+--------+----------+----------------------------------------------------+
| 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)也被提到并被索引?