0

次のクエリの場合:

SELECT m.id, m.body, m.poster, m.added 
   FROM messages m
   WHERE  ((m.poster_id = '11' OR m.poster_id = '22') AND (m.to = '11' OR m.to = '22'))
   ORDER BY m.id DESC
   LIMIT 10

最高のインデックスは何ですか?

(poster_id, to, id) を試しました - 約 1.5 秒 (poster_id, to) を試しました - 約 0,10 秒

注文を削除すると、0.00秒になります

問題は、空の結果でも、ORDER BY を使用しても、まだ 0.09 が得られることです。

説明:

+----+-------------+-------+-------+------------------------------+-----------------+---------+------+------+-----------------------------+
| id | select_type | table | type  | possible_keys                | key             | key_len | ref  | rows | Extra                       |
+----+-------------+-------+-------+------------------------------+-----------------+---------+------+------+-----------------------------+
|  1 | SIMPLE      | m     | range | posterid_to_idx,to,poster_id | posterid_to_idx | 8       | NULL |    4 | Using where; Using filesort |
+----+-------------+-------+-------+------------------------------+-----------------+---------+------+------+-----------------------------+

ありがとう

4

2 に答える 2

0

クエリを単純化してみてください。

SELECT m.id, m.body, m.poster, m.added 
FROM messages m
WHERE  m.poster_id IN ('11', '22') AND 
       m.to = IN ('11', '22')
ORDER BY m.id DESC
LIMIT 10

m.id単独で) 、、m.poster_idおよびにインデックスを追加しますm.to

于 2012-08-29T07:43:41.387 に答える
0

IN次の句を使用してクエリを書き直す必要がある場合があります。

SELECT m.id, m.body, m.poster, m.added 
FROM messages m
WHERE  m.poster_id IN(11, 22) AND 
        m.to IN(11, 22)
ORDER BY m.id DESC
LIMIT 10;

最高のパフォーマンスを得るには、次のカバーリングインデックスを追加します。

ALTER TABLE messages  ADD KEY ix1(poster_id, to, id, body, poster, added)

高速挿入の場合は、通常のインデックスを試すことができます。

ALTER TABLE messages  ADD KEY ix1(poster_id, to, id);
于 2012-08-29T07:44:14.847 に答える