2012-04-10 13 views
1

私は次のクエリを実行していると私はそれを変更しかし、それはまだ完全に受け入れられないとなる実行するために、ほぼ5秒かかります...MySQLのテーブルやクエリの最適化

クエリ:

SELECT cat1, cat2, cat3, PRid, title, genre, artist, author, actors, imageURL, 
lowprice, highprice, prodcatID, description 
from products 
where title like '%' AND imageURL <> '' AND cat1 = 'Clothing and accessories' 
order by userrating desc 
limit 500 

I "like%"を取り出し、 "imageURl <" ''を取り出してみましたが、それでも同じです。私は1列だけを返そうとしましたが、まだ同じです。

私はテーブル内のほぼすべての列にインデックスを持っています。もちろん、クエリに記載されているすべての列があります。

これは基本的にカテゴリの一覧です。全文索引を持つタイトル欄の何かを全文検索すると、1秒未満で終わります。

別の全文索引を列cat1に追加し、その列の「照合」にクエリのフォーカスを変更する必要がありますか?

私はあまり期待していますか?

テーブルのサイズは300万行になりません。

+0

テーブルスキーマ – amd

+0

ほとんどの列で3ミルの行テーブルとインデックスを表示できますか? –

答えて

1

あなたは、すべての列にインデックスがあると言いました。あなたはのようなインデックスを持っていますか?

alter table products add index (cat1, userrating) 

お手数ですが、お試しください。そのクエリを実行し、それがより速く実行されているかどうかを教えてください。

また、実際にはタイトル、フィールド、右に%の代わりに何らかのフィルタを設定しているとしますか?

+1

それでもまだ華麗ではないが、半分以上の時間をカットする - それに感謝! –

1

cat1を整数として、次に300万行の文字列にする必要があります。また、正しくインデックスを作成する必要があります。すべての列の索引付けを改善しただけでは、システムが行うデフォルトの処理になります。

それ以外は、title LIKE '%'は何もしません。あなたが検索するために使用すると思います。`title LIKE 'search%'

これを取得するためにフレームワークを使用していますか?多くの列を持つ500行を取得すると、フレームワークがこれを大きな配列に保存する場合、システムを使い果たす可能性があります。おそらくそうではないかもしれませんが、
普通の$query = mysql_query()while($row = mysql_fetch_object($query))を試してみてください。

0

クエリされた列:title、imageURL、cat1のインデックスを追加することをお勧めします。 2番目の改善点:SQLサーバーのキャッシュを使用すると、速度が大幅に向上します。 最後の改善点:クエリが常にそのようなものである場合、値のみが変更され、次にプリペアドステートメントが使用されます。

0

まあ、LIKE句の最初の文字として%があることは確かです。その場合、その列の完全なテーブルスキャンが実行されます(その場合は、すでに完全なテーブルスキャンが実行されていないため、 AND句の節)。 それに加えて、cat1のインデックスにインデックスを追加しようとします。また、データセットのサイズを小さくするために、クエリに他の基準を追加してください。つまり、作業データセット(クエリに一致する行数はLIMIT句なし)が大きすぎる可能性があります。