1

[解決済み:編集2を見てください]次のクエリは終了するのに37秒かかります(このクエリは、ユーザーが作成した50番目の投稿と対応する作成日を取得します)

SELECT p.id, 
       (SELECT id 
        FROM   posts 
        WHERE  owneruserid = p.id 
        ORDER  BY creationdate 
        LIMIT  49, 1) AS post50id, 
       (SELECT creationdate 
        FROM   posts 
        WHERE  id = post50id) 
FROM   prol_users p 
WHERE  postcount >= 50 

一方、以下は終了するのに30分かかります(5番目の投稿)

SELECT p.id, 
       (SELECT id 
        FROM   posts 
        WHERE  owneruserid = p.id 
        ORDER  BY creationdate 
        LIMIT  4, 1) AS post5id, 
       (SELECT creationdate 
        FROM   posts 
        WHERE  id = post5id) 
FROM   prol_users p 
WHERE  postcount >= 50 

クエリを実行するのは初めてなので、キャッシュは必要ありません。最初のクエリと2番目のクエリの唯一の違いはlimit 49,1対limit 4, 1

クエリが5行に制限されている場合よりも50行に制限されている場合の方が時間がかからない理由はありますか?


出力の説明:

--Note: The faster one, limit 50
mysql> explain select p.id, (select id from posts where owneruserid = p.id order by creationdate limit 49,1) as post50id, (select creationdate from posts where id = post50id) from prol_users p where postcount >= 50;
+----+--------------------+-------+--------+--------------------------+-----------------+---------+------------+--------+-----------------------------+
| id | select_type        | table | type   | possible_keys            | key             | key_len | ref        | rows   | Extra                       |
+----+--------------------+-------+--------+--------------------------+-----------------+---------+------------+--------+-----------------------------+
|  1 | PRIMARY            | p     | ALL    | NULL                     | NULL            | NULL    | NULL       | 199026 | Using where                 |
|  3 | DEPENDENT SUBQUERY | posts | eq_ref | PRIMARY                  | PRIMARY         | 4       | func       |      1 | Using where                 |
|  2 | DEPENDENT SUBQUERY | posts | ref    | idx_owneruserid,idx_ouid | idx_owneruserid | 5       | jagat.p.id |     11 | Using where; Using filesort |
+----+--------------------+-------+--------+--------------------------+-----------------+---------+------------+--------+-----------------------------+
3 rows in set (0.00 sec)

--Note: The slower one, limit 5
mysql> explain select p.id, (select id from posts where owneruserid = p.id order by creationdate limit 4,1) as post5id, (select creationdate from posts where id = post5id) from prol_users p where postcount >= 50;
+----+--------------------+-------+--------+--------------------------+------------------+---------+------+--------+-------------+
| id | select_type        | table | type   | possible_keys            | key              | key_len | ref  | rows   | Extra       |
+----+--------------------+-------+--------+--------------------------+------------------+---------+------+--------+-------------+
|  1 | PRIMARY            | p     | ALL    | NULL                     | NULL             | NULL    | NULL | 199026 | Using where |
|  3 | DEPENDENT SUBQUERY | posts | eq_ref | PRIMARY                  | PRIMARY          | 4       | func |      1 | Using where |
|  2 | DEPENDENT SUBQUERY | posts | index  | idx_owneruserid,idx_ouid | idx_creationdate | 8       | NULL |      5 | Using where |
+----+--------------------+-------+--------+--------------------------+------------------+---------+------+--------+-------------+
3 rows in set (0.00 sec)

編集:さまざまな制限値でテストしましたが、制限を9,1から10,1に変更すると、パフォーマンスが大幅に向上することに気付きました。実際、Explainプランも変更されています(50のプランに)。なぜそうなるのかについての洞察はありますか?また、インデックス投稿(creationdate、owneruserid)を追加しましたが、パフォーマンスに目に見える違いはありません。

force index (idx_owneruserid)Edit2:最後に、最初のサブクエリを使用して機能させました。教訓:Explain Planが期待どおりにインデックスを使用しない場合は、forceインデックスを使用します。

4

0 に答える 0