sql >> データベース >  >> RDS >> Mysql

MySQLでLimit句を改善する方法

    これを試してください:

    SELECT post_id
        FROM posts
        ORDER BY post_id DESC
        LIMIT 0, 10;
    

    LIMITによるページネーション とにかく注文しないとあまり意味がなく、問題が解決するはずです。

    mysql> explain select * from foo;
    +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
    | id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
    +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
    |  1 | SIMPLE      | foo   | index | NULL          | PRIMARY | 4       | NULL |   20 | Using index |
    +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
    1 row in set (0.00 sec)
    
    mysql> explain select * from foo limit 0, 10;
    +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
    | id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
    +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
    |  1 | SIMPLE      | foo   | index | NULL          | PRIMARY | 4       | NULL |   20 | Using index |
    +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
    1 row in set (0.00 sec)
    
    mysql> explain select * from foo order by id desc limit 0, 10;
    +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
    | id | select_type | table | type  | possible_keys | key     | key_len | ref  | rows | Extra       |
    +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
    |  1 | SIMPLE      | foo   | index | NULL          | PRIMARY | 4       | NULL |   10 | Using index |
    +----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+
    1 row in set (0.00 sec)
    

    コメント参加についての最後のコメントについて。 comment(post_id)にインデックスがありますか ?テストデータを使用すると、次の結果が得られます。

    mysql> alter table comments add index pi (post_id);
    Query OK, 0 rows affected (0.15 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> explain select c.id from  comments c inner join (select id from posts o order by id  limit 0, 10) p on c.post_id = p.id;
    +----+-------------+------------+-------+---------------+---------+---------+------+------+--------------------------+
    | id | select_type | table      | type  | possible_keys | key     | key_len | ref  | rows | Extra                    |
    +----+-------------+------------+-------+---------------+---------+---------+------+------+--------------------------+
    |  1 | PRIMARY     | <derived2> | ALL   | NULL          | NULL    | NULL    | NULL |   10 |                          |
    |  1 | PRIMARY     | c          | ref   | pi            | pi      | 5       | p.id |    4 | Using where; Using index |
    |  2 | DERIVED     | o          | index | NULL          | PRIMARY | 4       | NULL |   10 | Using index              |
    +----+-------------+------------+-------+---------------+---------+---------+------+------+--------------------------+
    

    およびテーブルサイズの参照用:

    mysql> select count(*) from posts;
    +----------+
    | count(*) |
    +----------+
    |    15021 |
    +----------+
    1 row in set (0.01 sec)
    
    mysql> select count(*) from comments;
    +----------+
    | count(*) |
    +----------+
    |     1000 |
    +----------+
    1 row in set (0.00 sec)
    



    1. PHP / MySQL Order byおよびRand()

    2. GROUP BY+CASEステートメント

    3. RODBCMySQL接続の例

    4. mysqldumpからの出力をより小さなファイルに分割するにはどうすればよいですか?