2012-04-29 10 views
2

cities(ほぼ3M行)とcountries(数百行)の2つのテーブルから都市と国を選択するには、PHPとjQueryを使用してライブ検索を行う必要があります。インデックスを使用していないMySQLのインデックス

私はInnoDBとしてcitiesためMyISAMテーブルを使用して考えていた短い瞬間はFULLTEXT検索をサポートしていないために、しかし、それは(頻繁にテーブルのクラッシュを移動するための方法ではないことを決め、他のすべてのテーブルはInnoDBなどあるとMySQL 5.6と+ InnoDBFULLTEXTインデックスをサポートし始めます)。

今のところ、私はまだMySQL 5.1を使用しています。ほとんどの都市は1単語のみまたは最大2〜3単語から構成されています。 "ニューヨーク" - "ニューヨーク"を意味する場合、ほとんどの人が "ヨーク"を検索しません。だから、私はちょうどcity_real列(これはvarcharです)にインデックスを置くだけです。

次のクエリ(IはUSE INDEXと、任意JOINなしとORDER BYことなく、異なるバージョンでそれを試してもFORCE INDEXで、Iは)=(代わりに等しいLIKE試みたが、別のポストが速かったとワイルドカードである場合=前記最後には、それを使用しても問題ありません)、EXPLAINでは、 "filesortを使用して、whereを使用する"と常に言います。クエリの平均時間は約4秒です。これは、ライブ検索(テキストボックスで入力し、都市や国の提案を表示するユーザー)のために少し遅くなることを認める必要があります...

ライブ検索ユーザーは、少なくとも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 

ci.idPRIMARYci.city_realINDEXありますを入力した場合jQueryのアヤックス)が検索されます。 MySQLがインデックスを使用しない理由は何ですか?または、どのように私はクエリをスピードアップすることができますか?それ以外の場合は、INDEXを設定するべきではありませんか?

ご協力いただきありがとうございます。


は、ここであなたがWHERE city_real LIKE 'cit%'、ないWHERE city_real='cit%'を使用する必要があり、出力

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  

答えて

3

を説明します。

私は(=)の代わりに等しいLIKE試してみましたが、別のポストは速かったとワイルドカードのみが最後である場合、これが間違っている

それを使用してOKです。=と=はワイルドカードをサポートしていないので、間違った結果が得られます。

どのようにクエリを高速化できますか?

インデックスが両方のテーブルのcountry_idにあることを確認してください。さらなるヘルプが必要な場合は、EXPLAIN SELECT ...の出力を投稿してください。

1

説明出力のkeyフィールドに示されているように、クエリはインデックスを使用します。 filesortを使用する理由はorder byであり、その理由はおそらくフィールドの1つ(city_real、population)がnull値を許可するためです。

関連する問題