1

user_id(キー:MUL)に一意でないインデックスを持つデータベースにテーブル'posts'があります。

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 |
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------------+

2番目のテーブル「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」です。前の表の「user_id」と同様に「 REF 」であると予想しましたが、この「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_idfolloweruser_id

したがって、インデックスは、user_idANDin句の両方を使用するクエリに使用されます。followerWHERE

フィールドに別のインデックスを追加するuser_idと、同じ説明が表示されます。

于 2012-08-09T12:09:11.333 に答える