0

次のような情報を保存する必要があるWebサイトを実行しています。

table: logs
 * date  (date)
 * server_1 (unsigned int)
 * server_2 (unsigned  int)
 * user_id (unsigned  int)
 * ip (unsigned int)
 * service (enum)
 * traffic (unsigned bigint)

私のクエリは主に次のようになります。

SELECT SUM(traffic) FROM logs WHERE user_id = 8381 AND date > DATE_ADD(CURDATE(), INTERVAL -7 DAY) AND service != 'unknown'

トラフィックを除くすべてのフィールドの複合主キーと、user_id とサービスのインデックスがあります。

トラフィックをフロートとして保存する方が効率的ですか?

また、MyIsam は優れたエンジンですか、それとも innodb を使用する必要がありますか?

それとも別のデータベース システムですか?

テーブルは非常に大きくなり (数千万行)、頻繁にクエリが実行されます。

4

2 に答える 2

1

インデックスの最初の「n」フィールドを使用しない限り、 MySQLは複合インデックスを使用しません。

MySQL は、インデックス内のすべての列をテストするクエリ、または最初の列、最初の 2 つの列、最初の 3 つの列などだけをテストするクエリに、複数列のインデックスを使用できます。インデックス定義で列を正しい順序で指定すると、単一の複合インデックスで同じテーブルに対する複数の種類のクエリを高速化できます。

少なくとも、重要なフィールド、特にdate列ごとに個別のインデックスを作成してください。

于 2012-05-20T11:51:08.247 に答える
0

Alnitakが指摘しているように、問題はインデックスがどのように定義されているかです。これらのログへの高速アクセスが必要な場合は、1つのインデックスではおそらく十分ではありません。

最適化は通常、インデックス作成によってのみ行われます(少なくともあなたの場合)。他の質問に答えるには:

  • トラフィック属性をフロートにキャストしてもパフォーマンスは向上しません。違いはありません。
  • MyISAM速いです!InnoDBDBトランザクションのオーバーヘッドがすべてあるため、速度が低下します。しかし:それはあなたが望むものに依存します。MyISAM常に壊れることがあるため(電源オフなど)、非常に危険です。速度がそれを使用する主な理由ですが、あなたの場合、それがそれほど大きな違いを生むとは思いません(ただし、インデックス作成はそうです)。データが重要でない場合を除いて、常にを使用InnoDBしてください(ログの場合はこれを無視できます)。
  • 他のDBMSは基本的にのように動作しますInnoDB。私は現在PostgreSQL、非常に成熟したを使用していますが、確かにそれほど速くはありませんMyISAM

したがって、適切なインデックスを定義してみてください。ここでのクエリには、のインデックスが必要user_id, dateです。:順序は重要です!

于 2012-05-20T12:13:29.267 に答える