web-dev-qa-db-ja.com

mysqlは最後のn行から選択します

インデックス(自動インクリメント)と整数値を持つテーブルがあります。テーブルの長さは数百万です。

テーブルの最後のn行に特定の番号が最も効率的に表示される場合、どのように検索できますか?

65
Nir

@ -chaosで指定された answer から開始しますが、いくつかの変更を加えます。

  • LIMITを使用する場合は、常にORDER BYを使用する必要があります。 RDBMSテーブルの暗黙的な順序は保証されていません。プライマリキーの順序で行を取得できます。通常はですが、これに依存することも、移植性もありません。

  • 降順で並べ替える場合、テーブルの行数を事前に知る必要はありません。

  • 相関名(別名テーブルエイリアス)を派生テーブルに与える必要があります。

クエリの私のバージョンは次のとおりです。

SELECT `id`
FROM (
    SELECT `id`, `val`
    FROM `big_table`
    ORDER BY `id` DESC
    LIMIT $n
) AS t
WHERE t.`val` = $certain_number;
91
Bill Karwin

非常に遅い答えかもしれませんが、これは簡単で良いことです。

select * from table_name order by id desc limit 5

このクエリは、テーブルに挿入した最後の5つの値(最後の5行)のセットを返します。

Mysqlで最後の5行を取得

このクエリは完全に機能しています

SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC

または

select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc
13
M Palani Mca

ページネーションの場合と同様に、SORTおよびLIMITを活用してください。行のi番目のブロックが必要な場合は、OFFSETを使用します。

SELECT val FROM big_table
where val = someval
ORDER BY id DESC
LIMIT n;

Nirへの応​​答:並べ替え操作は必ずしもペナルティを受けるわけではありません。これは、クエリプランナーの処理内容によって異なります。この使用例はページネーションのパフォーマンスにとって重要であるため、いくつかの最適化があります(上記のリンクを参照)。これはpostgresにも当てはまります。「ORDER BY ... LIMITはソートなしで実行できます」 E.7.1。最後の箇条書き

explain extended select id from items where val = 48 order by id desc limit 10;
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type  | possible_keys | key     | key_len | ref   | rows | Extra       |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
|  1 | SIMPLE      | items | const | PRIMARY       | PRIMARY | 4       | const |    1 | Using index | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
12
Dana the Sane

それは自動インクリメントなので、ここに私の意見があります:

Select * from tbl 
where certainconditionshere 
and autoincfield >= (select max(autoincfield) from tbl) - $n
3
Michael Buen

これは少し古いかもしれませんが、PDO::lastInsertId。私はそれがあなたがそれをしたいことをすると思いますが、PDOを使用するようにアプリケーションを書き直す必要があります(これは攻撃に対してはるかに安全です)

0
Luke Madhanga