インデックス (オートインクリメント) と整数値を持つテーブルがあります。テーブルの長さは数百万行です。
テーブルの最後の n 行に特定の数値が含まれているかどうかを最も効率的に検索するにはどうすればよいですか?
インデックス (オートインクリメント) と整数値を持つテーブルがあります。テーブルの長さは数百万行です。
テーブルの最後の n 行に特定の数値が含まれているかどうかを最も効率的に検索するにはどうすればよいですか?
@chaosからの回答から始めますが、いくつかの変更があります。
ORDER BY
を使用する場合は、常に使用する必要がありますLIMIT
。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を使用するようにアプリケーションを書き直す必要があります(攻撃に対してはるかに安全です)