PHP と jQuery を使用してライブ検索を実行し、2 つのテーブルcities
(ほぼ 300 万行) とcountries
(数百行) から都市と国を選択する必要があります。
しばらくの間、検索をサポートしていないMyISAM
ため、テーブルを使用することを考えていましたが、それは方法ではないと判断しました (頻繁なテーブルのクラッシュ、他のすべてのテーブルなどであり、MySQL 5.6 以降ではインデックスのサポートも開始されます)。cities
InnoDB
FULLTEXT
InnoDB
InnoDB
FULLTEXT
そのため、現在もまだ MySQL 5.1 を使用しています。ほとんどの都市は 1 単語のみ、または最大 2 ~ 3 単語で構成されているため、たとえば「New York」では、「New York」を意味する場合、ほとんどの人は「York」を検索しません。 . city_real
そのため、列 (varchar) にインデックスを付けただけです。
次のクエリ(私はさまざまなバージョンでそれを試しました。 anyJOIN
と without ORDER BY
、 withUSE INDEX
を使用しても、FORCE INDEX
代わりに LIKE を試しましたが、別の投稿では = の方が高速で、ワイルドカードが最後にのみある場合は問題ありませんそれを使用する)、EXPLAIN
常に「どこで使用して、ファイルソートを使用して」と言います。クエリの平均時間は約 4 秒です。これは、ライブ検索では少し遅いことを認めなければなりません (ユーザーがテキスト ボックスに入力し、都市や国の候補を表示します)...
ライブ検索 (jQuery ajax) は、ユーザーが 3 文字以上入力した場合に検索します...
SELECT ci.id, ci.city_real, co.country_name FROM cities ci LEFT JOIN countries co ON(ci.country_id=co.country_id) WHERE city_real='cit%' ORDER BY population DESC LIMIT 5
PRIMARY
onci.id
とINDEX
onがありci.city_real
ます。MySQL がインデックスを使用しない理由はありますか? または、どうすればクエリを高速化できますか? または、他にどこに設定する必要がありINDEX
ますか?
よろしくお願いいたします。
説明の出力は次のとおりです
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE ci range city_real city_real 768 NULL 1250 Using where; Using filesort
1 SIMPLE co eq_ref PRIMARY PRIMARY 6 fibsi_1.ci.country_id 1