私のテーブル
Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
userid int(11) NO MUL NULL
title varchar(50) YES NULL
hosting varchar(10) YES NULL
zipcode varchar(5) YES NULL
lat varchar(20) YES NULL
long varchar(20) YES NULL
msg varchar(1000)YES MUL NULL
time datetime NO NULL
それがテーブルです。500k 行のデータをシミュレートし、ランダムに 270k 行を削除して、500k の自動インクリメントで 230k だけを残しました。
これが私のインデックスです
Keyname Type Unique Packed Field Cardinality Collation Null
PRIMARY BTREE Yes No id 232377 A
info BTREE No No userid 2003 A
lat 25819 A YES
long 25819 A YES
title 25819 A YES
time 25819 A
それを念頭に置いて、ここに私のクエリがあります:
SELECT * FROM
posts
WHERElong
>-118.13902802886 ANDlong
<-118.08130797114 ANDlat
>33.79987197114 ANDlat
<33.85759202886 ORDER BY ID ASC LIMIT 0, 25
行 0 ~ 15 を表示しています (合計 16、クエリに 1.5655 秒かかりました) [id: 32846 - 540342]
クエリでは 1 ページしか表示されませんでしたが、230,000 件のレコードすべてを検索する必要があったため、それでも 1.5 秒かかりました。
説明されているクエリは次のとおりです。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE posts index NULL PRIMARY 4 NULL 25 Using where
そのため、where 句を使用して 16 個の結果しか返さない場合でも、クエリの速度は遅くなります。
たとえば、より広範な検索を行う場合:
SELECT * FROM `posts` WHERE `long`>-118.2544681443 AND `long`<-117.9658678557 AND `lat`>33.6844318557 AND `lat`<33.9730321443 ORDER BY id ASC LIMIT 0, 25
行 0 ~ 24 を表示しています (合計 25、クエリにかかった時間は 0.0849 秒) [id: 691 - 29818]
20ページから最初のページを取得し、合計483ページが見つかった場合ははるかに高速ですが、25に制限しています.
しかし、最後のページを要求すると
SELECT * FROM `posts` WHERE `long`>-118.2544681443 AND `long`<-117.9658678557 AND `lat`>33.6844318557 AND `lat`<33.9730321443 ORDER BY id ASC LIMIT 475, 25
行 0 ~ 7 を表示しています (合計 8、クエリに 1.5874 秒かかりました) [id: 553198 - 559593]
遅いクエリを取得します。
私の質問は、どうすれば適切なページネーションを実現できますか? ウェブサイトが公開されると、投稿が削除され、毎日何百もの投稿が行われることを期待しています. 投稿は ID またはタイムスタンプで並べ替える必要があります。一部のレコードが削除されるため、ID は連続していません。標準のページネーションが欲しい
1 2 3 4 5 6 7 8 ... [Last Page]