3

こんにちは、クエリの最適化戦略に特化したトピックがたくさんあることは知っていますが、これは非常に具体的であるため、インターネット上のどこにも答えが見つかりませんでした。

eshop に大きな製品テーブル (約 180k 行) があり、テーブルには 65 列あります。ええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええ

まだクエリに多くの列を考慮していませんが、選択はまだかなりトリッキーです。考慮し、比較する必要がある多くの条件があります。以下のクエリ

SELECT *
FROM products
WHERE production = 1 
AND publish_on < '2012-10-23 11:10:06' 
AND publish_off > '2012-10-23 11:10:06' 
AND price_vat > '0.5' 
AND ean <> ''
AND publisher LIKE '%Johnny Cash%'
ORDER BY bought DESC, datec DESC, quantity_storage1 DESC, quantity_storege2 DESC, quantity_storage3 DESC
LIMIT 0, 20

私はすでにwhere句の列にインデックスを1つずつ配置しようとしましたが、order by句でも、複合インデックスを作成しようとしました(production、publish_on、publish_off、price_vat、ean)。

クエリはまだ遅く (数秒) あり、eshop ソリューションと、結果がすぐに得られないために人々が去っていくので、高速である必要があります。そして、ページングを行うために、見つかったすべての行の検索を実行するのに必要な時間をまだ数えていません。

つまり、迅速にする最善の方法はクエリを単純化することですが、この場合、すべての条件と並べ替えが必須です。

誰でもこの種の問題を解決できますか? この種のクエリを高速化することは可能ですか、またはたとえばクエリを単純化し、残りをphpエンジンに残して結果をソートする方法は他にあります..

ああ、私はこれについて本当に無知です..あなたの知恵を共有してください.

よろしくお願いします

4

2 に答える 2

6

まず、何を選択したいのかを確認し、「*」を消去します

Select * from

より具体的なもので

Select id, name, ....

テーブルには Join などがないため、高速化オプションは非常に小さいと思います。

  1. mysql サーバーが十分なメモリを使用できることを確認してください。my.cnf のこの confis を見てください。

    • key_buffer_size = 384M;
    • myisam_sort_buffer_size = 64M;
    • thread_cache_size = 8;
    • query_cache_size = 64M
  2. 最大許容同時実行数を見てください。mysql が推奨する CPU*2

    thread_concurrency = 4

  3. 使用する情報と標準の正規化に応じて、テーブルを分割することを真剣に検討する必要があります。もし可能なら。

  4. テーブルを分割する方法がない生産的なシステムの場合は、キャッシュ サーバーを検討してください。ただし、これは、同じクエリが何度も繰り返される場合にのみ役立ちます。

これは、基盤となる実装やシステムについて何も知らない場合に行うことです。

編集:できるだけ多くの列をインデックス可能にすることで、必ずしもシステムが高速化されるとは限りません。インデックスが多いほど、速度は速くなります。

于 2012-10-24T12:23:32.070 に答える
0

良い発言をしてくれた皆さん、thx..

おそらく解決策を見つけたのは、クエリ時間を 2.8 秒から 0.3 秒に短縮できたからです。

解決策:大きなテーブル(65列)での使用SELECT *は本当に単純なので、ページに必要なのは25個だけであることに気付きました.他のものは製品ページ自体で簡単に使用できます.

また、テーブルのインデックスを少し再作成しました。に複合インデックスを作成しました

production、publish_on、publish_off、price_vat、ean

次に、列を含む検索専用に別のものを作成しました

タイトル、出版社、著者

私が最後にしたことは、次のようなクエリを使用することでした

SELECT SQL_CALC_FOUND_ROWS ID, title, alias, url, type, preorder, subdescription,....

これにより、影響を受けた行をより速く計算することができました

mysql_result(mysql_query("SELECT FOUND_ROWS()"), 0)

mysql_query() の後...ただし、EXPLAIN EXTENDED はクエリがインデックスを使用していないことを示しているため、どのように高速化できるのか理解できません。

それはかなりうまくいっているようです。order by 句がなかったら、すぐに悪いことになりますが、それは私が影響を与えるものではありません。

まだサーバー設定を確認する必要があります...

助けてくれてありがとう..

于 2012-10-25T08:53:25.417 に答える