インデックス(自動インクリメント)と整数値を持つテーブルがあります。テーブルの長さは数百万です。
テーブルの最後のn行に特定の番号が最も効率的に表示される場合、どのように検索できますか?
@ -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;
非常に遅い答えかもしれませんが、これは簡単で良いことです。
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
ページネーションの場合と同様に、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 |
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
それは自動インクリメントなので、ここに私の意見があります:
Select * from tbl
where certainconditionshere
and autoincfield >= (select max(autoincfield) from tbl) - $n
これは少し古いかもしれませんが、PDO::lastInsertId
。私はそれがあなたがそれをしたいことをすると思いますが、PDOを使用するようにアプリケーションを書き直す必要があります(これは攻撃に対してはるかに安全です)