geonames.orgの地理空間データベースを使用しています。現在、検索語をデータベースに転送して適切な結果を返すオートコンプリート入力フィールドをウェブサイトに持っています。重要なことの 1 つは、結果を国別に並べ替える必要があることです。
私が選択したテーブルは約 900.000 行あり、次のように作成されます。
CREATE TABLE IF NOT EXISTS `geonames` (
`id` integer NOT NULL AUTO_INCREMENT PRIMARY KEY,
`country_code` char(2) NOT NULL,
`postal_code` varchar(20) NOT NULL,
`place_name` varchar(180) NOT NULL,
...
FULLTEXT(country_code),
FULLTEXT(postal_code),
FULLTEXT(place_name)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
典型的なステートメントは次のようになります。
SELECT postal_code, place_name FROM geonames WHERE LOWER(`place_name`)
LIKE 'washin%' ORDER BY FIELD (country_code, 'JE', 'GB', 'FR', 'LI', 'CH',
'DK', 'LU', 'BE', 'NL', ... many more countries in that list ... ) DESC;
部分を高速化するためにFULLTEXTインデックスを使用しWHERE place_name LIKE 'washin%'
ます。しかし、それでもクエリはやや遅いです。SQL クエリのタスクは、place_name
一致するテーブル内のすべてを検索し'washin%'
、指定された国に従って結果を並べ替えることです。一度に大量のデータが要求されるため、クエリが遅くなりますか? はいの場合、このボトルネックで実行時間を短縮するにはどうすればよいですか?
私は決してMySQLの専門家ではないので、より経験豊富な人が表示されたSQLクエリを高速化するのを手伝ってくれるか、少なくとも最適化の方向性を教えてくれたらうれしいです.
どうもありがとうございました!