-2

私は、マネージメント教育の領域でシミュレーションを行う自己資金によるスタートアップであるLearnBiz Si​​mulationsに取り組んでいます。

(a) 当社のウェブサイトは現在、約 16,000 人に対応しています。現在、データベースのサイズは 30 mb で、合計で約 90 のテーブルがあり、各テーブルには 5 ~ 50 の列がある場合があります。データベース内のすべてのテーブルには、挿入、削除、または更新の新しい行が繰り返し含まれています。ただし、列は追加されません。インデックス作成手法の採用に問題はありますか? 行を挿入したり削除したりするだけでもインデックス作成が役に立たなくなることを示唆するフォーラムやビデオが他にもいくつかありました。

(b) 当社の Web サイトでの最大の作業は、200 ~ 800 行のコード行を処理する mysql クエリです。私たちのクエリのほぼ 95%+ には、必要な行を特定するために、複数の等式 where 句があります。私の理解が正しければ、インデックス作成を使用すると、プロセスを数倍高速化できますか?

(c) 毎分多数の参加者のデータを処理するシミュレーションがいくつかあります。このようなシミュレーションでは、現在、一度に 50 人の参加者に対応することさえできません。インデックス作成を採用することで、そのようなシミュレーションでより多くのユーザーを獲得できるでしょうか?

(d) 現在使用しているサーバーは、GoDaddy を使用した VDS です (年間約 400 ドルの費用がかかります)。ウェブサイトを高速化するために、DDS (年間約 3000 ドルの費用) に移行するか、TokuDB のようなものを入手することは理にかなっていますか? 現在のシステム、つまりサーバー + データベース + コーディングのユーザー容量を判断する方法はありますか?

4

2 に答える 2

3

インデックスの質問に関しては、インデックスは望ましいだけでなく、物事を「スピードアップ」するために必要です。私が理解しているように(「素人」の用語で)、インデックスの機能は、テーブル内のデータの検索と回復を高速化することです。

索引を使用する理由:

  1. 各テーブルの各行を一意に識別します (結局のところ、主キーはインデックスです)
  2. インデックスがソートされている (データがソートされていない場合でも)
  3. 検索とフィルターの高速化: インデックスは、テーブル内のデータの配置を「保持」するため (復元するデータを「特定」するため)、データの復元を高速化します。また、データベース エンジンによるデータのフィルタリングが容易になります (スクランブルされたデータよりも並べ替えられたデータをフィルタリングする方が常に高速で簡単です) 。
  4. 関連テーブルを使用する場合のデータの復元方法を最適化する: 主キーと外部キーの関係を含むクエリを高速化するために、すべての外部キーにインデックスを付ける必要があります。

インデックスを作成する必要があるフィールドを決定するために使用するいくつかの「経験則」:

  • すべての主キーにインデックスが付けられます (明白なこと: 主キーは一意で、null ではない必要があります)。
  • すべての外部キーにインデックスを付ける必要があります (主キーと外部キーの関係を効率的にするため)
  • 検索を実行する必要があるすべての数値フィールドまたは日付フィールドには、インデックスを付ける必要があります。とは言っても、doubleフィールド (またはその他の浮動小数点数値型) にインデックスを付けないようにしています。これらのフィールドは、通常、検索対象ではない値を格納するために使用されるためです。
  • 検索を実行する必要があるすべてのcharまたはフィールドには、インデックスを付ける必要があります。非常に大きな値を保持できるため、フィールドのvarcharインデックスは避けてください。text
  • バイナリ ( blob) フィールドのインデックス作成は避けてください...意味がありません
  • すべてを索引付けする誘惑に陥らないでください。時間をかけて、インデックスを作成する必要があるフィールドとインデックスを作成しないフィールドを決定してください。
于 2013-03-06T17:29:21.857 に答える
2

(a) それらのフォーラムやビデオは無意味で、半分真実を無意識に繰り返しています (はい、インデックスを使用するとオーバーヘッドが発生します。通常、パフォーマンスの向上がそれを何度も上回っているだけです)。

(b) ほとんどの場合、実際に役立つインデックスを作成するように注意してください。MySQL のドキュメントには、それを行う方法に関する章全体があります (一般に、最適化の章全体も見たいと思うでしょう)。

(c) ベンチマークが過剰なトラフィックをシミュレートしていないことを確認してください。たとえば、一度に 50 人の実際のユーザーが 1 秒あたり 50 の接続を生成することはありません。繰り返しますが、インデックスを実装してクエリを最適化すると、パフォーマンスが向上するはずです

(d) データベース サーバーが適切に構成されていない場合、いくらリソースを増やしても役に立ちません (クエリ キャッシュを使用しますか? MySQL がテーブルをメモリに保持するのに十分なメモリを使用できるようにしますか? など)。

要約すると、リソースを効果的に利用できるように、MySQL サーバーの基本的な構成について読んでください (通常、デフォルトでは十分ではありません)。また、マニュアルの最適化の章も参照してください。

于 2013-03-06T17:27:23.787 に答える