1

次のクエリを実行していますが、変更しても、実行には5秒近くかかりますが、これは完全に受け入れられません...

クエリ:

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

「like%」を取り出して、「imageURl <>''」を取り出してみましたが、それでも同じです。私は1つの列だけを返してみましたが、それでも同じです。

テーブルのほぼすべての列、確かにクエリで言及されているすべての列にインデックスがあります。

これは基本的にカテゴリリスト用です。全文索引のあるタイトル列で何かを全文検索すると、1秒もかかりません。

列cat1に別のフルテキストインデックスを追加し、クエリフォーカスをその列の「一致」に変更する必要がありますか?

期待しすぎですか?

テーブルの行数は300万行に満たない。

4

4 に答える 4

1

むしろ、cat1を整数として、次にこれらの300万行の文字列を使用する必要があります。また、正しくインデックスを作成する必要があります。すべての列のインデックス作成が改善されただけの場合、それはシステムが行うデフォルトのことです。

それ以外title LIKE '%'は何もしません。検索に使うと思いますので`title LIKE 'search%'

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

于 2012-04-10T06:49:27.850 に答える
1

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

alter table products add index (cat1, userrating)

そうでない場合は、試してみてください。そのクエリを実行し、実行速度が速いかどうかを知らせてください。

%また、タイトル、フィールドではなく、実際に何らかのフィルターを設定していると思いますよね?

于 2012-04-10T06:52:15.680 に答える
0

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

于 2012-04-10T06:49:33.400 に答える
0

%まあ、私は、句の最初の文字として、その列の全表スキャンを提供すると確信してLIKEいます(あなたの場合、句にすでに制限句があるため、その全表スキャンは実行されませんAND)。cat1その横に、列にインデックスを追加してみてください。また、データセットのサイズを小さくするために、クエリに他の基準を追加してみてください。作業データセット(LIMIT句なしでクエリに一致する行数)も大きすぎる可能性があります。

于 2012-04-10T06:53:47.317 に答える