タグ: MySQL を抽出しています。
Total: 2

広域で地図を表示した時の、マーカーのパース

2008/4/10 18:41
mysqlのスロークエリーログを見ていたら、マーカーのパースでいくつか。

ベースのクエリーは概ねこんな感じ
SELECT *,(ABS(m.lat-$centerY) + ABS(m.lng-$centerX)) d FROM map m WHERE m.lat between '$minY' AND '$maxY' AND m.lng between '$minX' AND '$maxX' ORDER BY d LIMIT 200;
$maxX
$minX
$maxY
$minY
は、Javascriptからajaxで投げてくる。$minY > $maxXの時は補正を追加したり。

で、ズームレベルが10以下くらいの広域の時。
対象マーカーが数万個ということになってしまい、ORDER BY dにかなり時間がかかる(1.5秒とか)。

$zrv = 0.4;
$maxX = $centerX + $zrv;
$minX = $centerX - $zrv;
$maxY = $centerY + $zrv;
$minY = $centerY - $zrv;

地図全部をみないで、中心からある程度範囲で絞る補正を入れる。
ボストマップの場合、0.4で都内だと5000個、地方で300個くらいが対象になるようなので、とりあえず0.4にしてみた。5000個くらいであれば、0.1秒程なので、ストレスはなさそう。

激速になった。(今比)

2008/4/4 02:58
テストで今あるデータベースを移植してみて、いろいろ動かしてみたら激重。

MySQLを検証。とにかくソートが遅い。

Aというtableに10万件。(mapデータ)
Bというtableに20万件。(nodeデータ)

こいつをwhereで等価結合して、ソート。
Bのフィールドでソートすると、10秒とか20秒とか30秒とか掛かる。
Aのフィールドでソートすると、コンマゼロ何秒でいけたりする。

LEFT JOINとかWHEREの抽出内容とか、いろいろやってみるも何も変わらない。とにかくAでソートするのだ。たぶん小さい方ということだ。重複にはなるけれども、ソートに使うフィールドは、Aに(も)作るべし。

今のポストマップは見るに耐えられないスピードなので早くリニューアルしたい。けれど、やることはまだ結構ある。
前 | 1 | 次

Rottel内コンテンツ

ユーザー一覧

Rottelとは?
利用規約
開発飲料
利用者の声
ヘルプ
close