cities
(ほぼ3M行)とcountries
(数百行)の2つのテーブルから都市と国を選択するには、PHPとjQueryを使用してライブ検索を行う必要があります。インデックスを使用していないMySQLのインデックス
私はInnoDB
としてcities
ためMyISAM
テーブルを使用して考えていた短い瞬間はFULLTEXT
検索をサポートしていないために、しかし、それは(頻繁にテーブルのクラッシュを移動するための方法ではないことを決め、他のすべてのテーブルはInnoDB
などあるとMySQL 5.6と+ InnoDB
もFULLTEXT
インデックスをサポートし始めます)。
今のところ、私はまだ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.id
上PRIMARY
とci.city_real
にINDEX
ありますを入力した場合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