68

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

テーブルの最後の n 行に特定の数値が含まれているかどうかを最も効率的に検索するにはどうすればよいですか?

4

6 に答える 6

94

@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;
于 2009-02-22T01:52:32.470 に答える
20

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

select * from table_name order by id desc limit 5

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

于 2014-09-14T13:02:40.273 に答える
14

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
于 2013-09-02T07:27:31.770 に答える
12

ページネーションの場合と同様に、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 | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+
于 2009-02-21T23:16:12.860 に答える
3

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

Select * from tbl 
where certainconditionshere 
and autoincfield >= (select max(autoincfield) from tbl) - $n
于 2009-02-22T02:36:13.207 に答える
0

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

于 2013-10-22T20:14:36.837 に答える