MySQLは、クエリでどのように処理し、制限しますか?
-
11-10-2019 - |
質問
このように見えるクエリがあります:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
順序はどのように機能しますか?すべてのレコードを注文するか、最初の20を取得するか、20のレコードを取得して注文しますか publish_date
分野?
それが最後のものである場合、あなたは本当に最新の20の記事を実際に入手することを保証されていません。
解決
最初に注文し、次に最初の20を取得します。データベースは、 WHERE
前の条項 ORDER BY
.
他のヒント
Limit句は、Selectステートメントによって返される行の数を制約するために使用できます。 Limitは、1つまたは2つの数値引数を取ります。どちらも非陰性整数定数でなければなりません(準備されたステートメントを使用する場合を除く)。
2つの引数を使用すると、最初の引数は最初の行のオフセットを指定します。2番目の引数は、戻る行の最大数を指定します。初期行のオフセットは0(1ではない)です。
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
特定のオフセットから結果セットの最後まですべての行を取得するには、2番目のパラメーターに多数を使用できます。このステートメントは、96行目から最後の行まですべての行を取得します。
SELECT * FROM tbl LIMIT 95,18446744073709551615;
1つの引数で、値は結果セットの先頭から戻る行の数を指定します。
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
つまり、limit row_countは制限0、row_countに相当します。
適切なインデックスがある場合、この場合は publish_date
フィールド、MySQLはインデックス全体をスキャンして20のレコードを要求されたレコードを取得する必要はありません。20のレコードはインデックスの開始時に見つかります。ただし、適切なインデックスがない場合は、テーブルの完全なスキャンが必要になります。
があります MySQLパフォーマンスブログ記事 これについて2009年から。
最も早いまたは最新のレコードを取得するために、注文の最後に[ASC]または[DESC]を追加できます
たとえば、これにより最初に最新のレコードが得られます
ORDER BY stamp DESC
追加します LIMIT
後の条項 ORDER BY
@jamesが言うように、すべてのレコードを注文し、最初の20行を取得します。
そうであるように、最初に公開された20の記事を取得することが保証されているため、新しい記事は表示されません。
あなたの状況では、追加することをお勧めします desc
に order by publish_date
, 、最新の記事が必要な場合は、最新の記事が最初になります。
結果を昇順に保つ必要がある場合、それでも最新の10の記事しか必要ない場合は、MySQLに結果を2回並べ替えるように依頼できます。
以下のこのクエリは、結果を下降する結果を並べ替え、結果を10に制限します(つまり、括弧内のクエリです)。それはまだ降順でソートされ、私たちはそれに満足していないので、私たちはMySQLにもう一度並べ替えるように頼みます。これで、最後の行に最新の結果が得られました。
select t.article
from
(select article, publish_date
from table1
order by publish_date desc limit 10) t
order by t.publish_date asc;
すべての列が必要な場合は、このように行われます。
select t.*
from
(select *
from table1
order by publish_date desc limit 10) t
order by t.publish_date asc;
手動でクエリを書いて、さまざまなものについてデータベースを調べるときにこの手法を使用します。私はそれを生産環境で使用していませんが、今ではベンチがマークしたとき、追加の並べ替えはパフォーマンスに影響を与えません。
このコードを使用できますSELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
ここで、0はレコードの開始制限と10レコードの数です
通常、制限は最後の操作として適用されるため、結果は最初にソートされ、次に20に制限されます。実際、最初の20のソートされた結果が見つかるとすぐにソートが停止します。
また、データベースによると、制限の構文は異なります。たとえば、:
mysql
- 制限1、2
postgres
- 制限2オフセット1