1

私のテーブルはシンプルです:

mysql> desc muralentry ;
+-----------------+------------------+------+-----+---------+----------------+
| Field           | Type             | Null | Key | Default | Extra          |
+-----------------+------------------+------+-----+---------+----------------+
| id              | int(11)          | NO   | PRI | NULL    | auto_increment |
| user_src_id     | int(11)          | NO   | MUL | NULL    |                |
| content         | longtext         | NO   |     | NULL    |                |
+-----------------+------------------+------+-----+---------+----------------+

mysql> desc muralentry_user ;
+-----------------+------------------+------+-----+---------+----------------+
| Field           | Type             | Null | Key | Default | Extra          |
+-----------------+------------------+------+-----+---------+----------------+
| muralentry_id   | int(11)          | NO   | PRI | NULL    | auto_increment |
| userinfo_id     | int(11)          | NO   | MUL | NULL    |                |
+-----------------+------------------+------+-----+---------+----------------+

次のクエリを実行しています。

SELECT DISTINCT *
FROM muralentry
LEFT OUTER JOIN muralentry_user ON (muralentry.id = muralentry_user.muralentry_id)
WHERE user_src_id = 1

説明:

+----+-------------+----------------------------+------+-------------------------------------------------------+-------------------------------------+---------+------------------------------------------+------+-----------------+
| id | select_type | table                      | type | possible_keys                                         | key                                 | key_len | ref                                      | rows | Extra           |
+----+-------------+----------------------------+------+-------------------------------------------------------+-------------------------------------+---------+------------------------------------------+------+-----------------+
|  1 | SIMPLE      | muralentry                 | ref  | muralentry_99bd10ae                                   | muralentry_99bd10ae                 | 4       | const                                    |  686 | Using temporary |
|  1 | SIMPLE      | muralentry_user            | ref  | muralentry_id,muralentry_user_bcd7114e                | muralentry_user_bcd7114e            | 4       | muralentry.id                            |   15 |                 |
+----+-------------+----------------------------+------+-------------------------------------------------------+-------------------------------------+---------+------------------------------------------+------+-----------------+

良い結果です(私にとっては:D)しかし、別のwhere句を追加すると:

SELECT DISTINCT *
FROM muralentry
LEFT OUTER JOIN muralentry_user ON (muralentry.id = muralentry_user.muralentry_id)
WHERE user_src_id = 1 OR userinfo_id = 1;

説明:

+----+-------------+----------------------------+------+-------------------------------------------------------+-------------------------------------+---------+------------------------------------------+---------+-----------------+
| id | select_type | table                      | type | possible_keys                                         | key                                 | key_len | ref                                      | rows    | Extra           |
+----+-------------+----------------------------+------+-------------------------------------------------------+-------------------------------------+---------+------------------------------------------+---------+-----------------+
|  1 | SIMPLE      | muralentry                 | ALL  | muralentry_99bd10ae                                   | NULL                                | NULL    | NULL                                     | 1140932 | Using temporary |
|  1 | SIMPLE      | muralentry_user            | ref  | muralentry_id,muralentry_user_bcd7114e                | muralentry_user_bcd7114e            | 4       | muralentry.id                            |      15 | Using where     |
+----+-------------+----------------------------+------+-------------------------------------------------------+-------------------------------------+---------+------------------------------------------+---------+-----------------+

うわー...ALOT最悪の場合の結果...どうすればこれを「修正」できますか? この仕事をするためにインデックスを作成する必要がありますか? または、クエリを再作成しますか?

私は次の結果を期待しています: ユーザーが「user_src_id」である「muralentry」行と、ユーザーが「userinfo_id」である「muralentry_user」行。

- 編集 -

ANDを書いたときに実際にORが欲しかったので、質問を編集しました...ごめんなさい!

4

0 に答える 0