1

20万行のデータをクエリしてWebページに表示するのにかかる時間を短縮しようとしています。通常は、約20〜30秒かかりますが、現在は約7〜10秒に短縮されています。せいぜい3〜7秒くらいかかる必要があります。

私のクエリでは、1つのテーブルのすべての行を選択し、PHPスクリプトに約5列を配置しています。クエリは次のようになります。

SELECT * FROM table where company = ? and division = ?;

セッションからパラメータを追加するだけです。次に、クエリとパラメータを.incファイルで送信すると、incがクエリを実行します。ただし、データのページ分割のために別のクエリも実行します。次に、2つのクエリを比較して、2つの間の不規則性をチェックします。次に、データを新しいウィンドウに配置します。

プロセスをスピードアップするために使用できる既知のアルゴリズムまたは手法はありますか?私はすでにガベージコードを削除し、いくつかの機能を高速化しましたが、それでも遅いです。

PS:私も2日前にシステムを扱ったばかりなので、まだ構造に慣れています。

4

2 に答える 2

2
  1. データベースへの永続的な接続を使用して、接続のオーバーヘッドを回避します。

  2. カーディナリティの高い列にすべてのテーブルの主キーがあることを確認します(多くの行がキー値と一致します)。さて、gender列のカーディナリティ(選択性)は低く、一意のユーザーID列のカーディナリティは高く、主キーになるのに適しています。

  3. 異なるテーブル間のすべての参照は、通常、インデックスを使用して行う必要があります(つまり、対応する列に基づく結合が高速になるように、それらは同一のデータ型である必要があります)。また、頻繁に検索する必要のあるフィールド(WHERE、ORDER BY、またはGROUP BY句に頻繁に表示される)にインデックスがあることを確認しますが、あまり多く追加しないでください。最悪の場合は、のすべての列にインデックスを追加することです。テーブル(テーブルに5つを超えるインデックスがあり、20〜30列のサイズのテーブルは見たことがありません)。比較で列を参照しない場合は、インデックスを作成する必要はありません。

  4. GRANTステートメントを発行するときに単純なパーミッションを使用すると、MySQLはクライアントがステートメントを実行するときのパーミッションチェックのオーバーヘッドを減らすことができます。

  5. 格納されている値を保持するために必要な大きさの列のみを宣言することにより、行あたりのRAMの使用量を減らします。

  6. 左端のインデックスプレフィックスを使用する— MySQLでは、複数の列にインデックスを定義して、そのインデックスの左側を別のインデックスとして使用できるようにして、必要なインデックスを少なくすることができます。

  7. インデックスが多くの列で構成されている場合は、短く、適度に一意で、インデックスが付けられたハッシュ列を作成してみませんか?すると、クエリは次のようになります。SELECT * FROM table WHERE hash_column = MD5(CONCAT(col1、col2))AND col1 ='aaa' AND col2 ='bbb';

  8. MySQLがクエリをより適切に最適化できるように、データがロードされた後、テーブルでANALYZE TABLE(またはmyisamchk --analyze fromコマンドライン)を実行することを検討してください。

  9. 可能な場合は(VARCHAR、BLOB、またはTEXTの代わりに)CHARタイプを使用します—列の値が一定の長さの場合:MD5-ハッシュ(32シンボル)、ICAOまたはIATA空港コード(4および3シンボル)、BICバンクコード(3シンボル) )など。CHAR列のデータは、可変長データ型列よりも高速に見つけることができます。

  10. 列が多すぎる場合は、テーブルを分割しないでください。行にアクセスする際の最大のパフォーマンスヒットは、行の最初のバイトを見つけるために必要なディスクシークです。

詳細については、以下をご覧ください。

http://www.ajaxline.com/32-tips-to-speed-up-your-mysql-queries

于 2012-10-21T02:39:54.820 に答える
1

まず、そのテーブルにインデックスがあることを確認します。クエリにcompanydivisionwhere句の両方が含まれている場合は、フィールド全体の複合インデックスが適切に機能します。

次に、ページネーションのために2番目のクエリを実行しないでください。句を使用して最初のクエリを実行し、limit必要なものをキャッシュして、そこからページ分割します。

于 2012-10-21T02:08:56.807 に答える