1

我在数据库中有一个表'posts',它在user_id(键:MUL)上有非唯一索引。

mysql> show columns from posts;
+---------+--------------+------+-----+-------------------+----------------+
| Field   | Type         | Null | Key | Default           | Extra          |
+---------+--------------+------+-----+-------------------+----------------+
| id      | int(11)      | NO   | PRI | NULL              | auto_increment |
| user_id | int(11)      | YES  | MUL | NULL              |                |
| post    | varchar(140) | NO   |     | NULL              |                |
+---------+--------------+------+-----+-------------------+----------------+

对于此表,explain 给出了类型为“ REF ”的预期解释

mysql> explain select * from posts where posts.user_id=1;
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | posts | ref  | user_id       | user_id | 5       | const |   74 | Using where |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+

我有第二个表'followers',其中'user_id'和'follower'是非唯一索引的一部分

mysql> show columns from followers;
+---------------+-----------+------+-----+---------------------+----------------+
| Field         | Type      | Null | Key | Default             | Extra          |
+---------------+-----------+------+-----+---------------------+----------------+
| id            | int(11)   | NO   | PRI | NULL                | auto_increment |
| user_id       | int(11)   | YES  | MUL | NULL                |                |
| follower      | int(11)   | YES  | MUL | NULL                |                |
+---------------+-----------+------+-----+---------------------+----------------+

但在此表中,类型为“ ALL ”。我希望它是“ REF ”,类似于上表中的“user_id”,这个“user_id”也有非唯一索引。对此有什么解释吗?

mysql> explain select * from followers where followers.user_id=1;
+----+-------------+-----------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table     | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | followers | ALL  | user_id       | NULL | NULL    | NULL |    6 | Using where |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------------+
4

1 回答 1

2

我会把它作为答案发布,因为我很确定情况就是这样。

我认为你会有所不同,因为在followers表中你有一个来自user_idfollower字段的复合键,而不仅仅是一个user_id.

因此,索引将用于同时使用user_idAND followerinWHERE子句的查询。

在字段上添加单独的索引user_id,您将得到相同的解释。

于 2012-08-09T12:09:11.333 回答