1

私は大きな大きなテーブル(InnoDB)を持っています。このテーブルには、基本的に場所の緯度と経度が記載された場所の名前が付いています。私のクエリは次のようなものです

SELECT columns FROM table  
WHERE latitude BETWEEN latMin AND latMax
AND longitude BETWEEN longMin AND longMax
AND location LIKE '%mcdonalds%'

唯一のインデックスは、自動インクリメント列のプライマリインデックスです。

InnoDBを使用したいので、FULLTEXTはオプションではありません

私が試したオプションの1つは、緯度と経度にインデックスを追加して、

SELECT id FROM table WHERE 
latitude BETWEEN latMin AND latMax
AND longitude BETWEEN longMin AND longMax

それから私はします

$stringOfIds = implode(",",$result);
SELECT columns FROM table WHERE id IN ($stringOfIds)
AND location LIKE '%mcdonalds%'

ただし、$ resultには数千のエントリが含まれる可能性があり、メモリを大量に消費するため、拡張性はあまり高くありません。

今のところ、私は全表スキャン(上記の最初のクエリ)に頼っていますが、クエリごとに0.5〜1秒かかるので、助けていただければ幸いです。

ありがとう

4

1 に答える 1

0

標準の B-TREE インデックスは、この種のクエリにはあまり適していません。geography タイプを使用するように設計を変更してから、 SPATIAL index を作成することをお勧めします。このインデックスを使用しMBRContainsて、バウンディング ボックス内にあるすべてのポイントをすばやく見つけることができます。

更新: 空間インデックスを作成するには、コメントで指摘されているように MyISAM が必要です。

于 2011-09-28T21:44:30.547 に答える