2011-01-24 3 views
1

私は約1,600,000レコードの都市テーブルを持っています。次のように私はオートコンプリートテキストボックスを持っていると私は、都市データをフェッチするクエリを持って、国のデータ:巨大都市テーブルにロードするのに時間がかかりすぎるオートコンプリート都市リストクエリ

SELECT m.idmetrocenter, m.idcountry, m.metrocentername, 
c.idcountry, c.countryname FROM metrocenter m 
INNER JOIN country c ON m.idcountry = c.idcountry 
WHERE (m.metrocentername like "ap%" OR c.countryname like "ap%") 
ORDER BY m.metrocentername, c.countryname 
LIMIT 10 

このクエリは、応答するために多くの時間がかかり、そのその応答時間はほぼ110秒です。 idmetrocenter、idcountry、metrocentername、countrynameに索引を作成しました。それでも応答が悪いです。

この出力をより速く達成するために誰も助けてくれますか?私は現在、教義を使用しています。もし私が教義の中の解決策を知ってもらえるのであれば、それはもっと良くなるでしょう。事前に

おかげ

答えて

1

まずexplainあなたのクエリにしようとすると、インデックスが効果的に使用されているかどうかを確認:

mysql> EXPLAIN SELECT m.idmetrocenter AS m__idmetrocenter, m.idcountry AS m__idcountry, m.metrocentername AS m__metrocentername, c.idcountry AS c__idcountry, c.countryname AS c__countryname FROM metrocenter m INNER JOIN country c ON m.idcountry = c.idcountry WHERE (m.metrocentername like "ap%" OR c.countryname like "ap%") ORDER BY m.metrocentername, c.countryname LIMIT 10 \G

第二: フルテキスト検索にLIKE文を変更しようとします( MATCH/AGAINSThttp://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

0

Francescoが提案したFTSのほかに、Dオクトリンビルトインsearch behaviour。これにより、定義された列のすべての単語を含む索引が作成され、効率的かつ迅速にアクセスできるようになります。

あなたがFTSを作り上げる/作り上げることができない場合は、これが方法です。

0

JOINSを実行しているときは、Cartesian productを実行する必要があります。それは非常に高価で、あなたはそれを避けるべきです。

この年齢では、data normalizationを忘れる必要があります。 Cal HendersonとしてFlickrから: ""(Slide 27 of 41)。検索が速くなります。これらのスライドは本当に良くて、良い情報がたくさんあります。それで、41のスライド24では、彼らは遅いためにLIKEを使わなかったと言います。彼らはFULLTEXTインデックス(スライド25の41)を使用します。

また、the data(autocomplete) in memoryをredisを使用してキャッシュして、サイトをスピードアップする必要があります。ソースをコンパイルできない場合(redis、コンパイルできる場合はphpredis、そうでなければプレーンなPHP版=>predis)その後、Redis To Goの無料プランを使用することもできます。レディスはfast!です。

関連する問題