squares
次のテーブル構造を持つ約 2,250,000 行を持つInnoDB エンジンで実行されている MySQL テーブルがあります。
`squares` (
`square_id` int(7) unsigned NOT NULL,
`ref_coord_lat` double(8,6) NOT NULL,
`ref_coord_long` double(9,6) NOT NULL,
PRIMARY KEY (`square_id`),
KEY `ref_coord_lat` (`ref_coord_lat`),
KEY `ref_coord_long` (`ref_coord_long`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
最初の列square_id
は 0 から 2.25M までの単純な増分値を保持し、 ref_coord_lat
&ref_coord_long
はポイントの緯度と経度の座標のセットをそれぞれ 10 進数で保持します。
これは読み取り専用のテーブルです。追加の行は追加されず、それに対して実行する必要がある唯一のクエリは次のとおりです。
SELECT * FROM `squares` WHERE
`ref_coord_lat` BETWEEN :southLat AND :northLat AND
`ref_coord_long` BETWEEN :westLong AND :eastLong
...ここで、コロンに続く値は PHP PDO プレースホルダーです。基本的に、このクエリの目的は、現在 Google マップ ウィンドウのビューポートにあるテーブル内のすべての座標点を取得することです。この座標点は、クエリ内の 4 つの座標で囲まれています。
このクエリが Google Maps API で実行されるズーム レベルを制限したため、フェッチできる最大行数は~5600です。ズーム レベルが上がると、結果として得られるフェッチの合計は大幅に減少します。
このようなサンプル クエリを PHPMyAdmin で直接実行すると、1.40 ~ 1.45 秒かかります。これは長すぎます。私はすでに標準インデックスを実行してref_coord_lat
おり、ref_coord_long
これによりクエリ時間が約 5 秒から短縮されましたが、これはエンド ユーザーがタイムリーな応答を期待するマップにはまだ大きすぎます。
私の質問は単純です:このテーブル/クエリをさらに最適化して、結果がフェッチされる速度を上げるにはどうすればよいですか?