2017-07-12 8 views
0

私が働いているところには、ジレンマがあります。私たちは、1テーブルが非常に大きくなっているデータベース(MariaDB 10)を使用しています(これは107.4GiBなので、1181万行です)。これはもちろん、システムのパフォーマンスに影響します。 私と同僚が議論していたので、彼はそのテーブルでパーティションを使用することを提案しました。これにより、パフォーマンスは向上しますが、DBのサイズは縮小されません。 しかし、以前は、そのテーブルから2年以上古いデータを別の場所にあるデータベースの正確なコピーに移動するcronジョブを作成していました。 私はそれがより効果的な方法だと感じます。私はこれを実行するだけでパフォーマンスを向上させるだけでなく(cronjobが実行されている間は除く)、テーブルのサイズも小さくなることがわかっています。 とにかくこの古いデータにお客様が興味を持っているとは考えていません。パーティショニングと追加のデータベース

質問:あなたは何を選択しますか?古いデータは使用されず、メインDBをよりきれいに保つため、私の選択肢が好きです。私の同僚は、常に負荷が少なく、顧客が古いデータにアクセスできるため、ソリューションを好む。

私はパーティショニングを使用するためにプロのいくつかを読んだことがあるが、/これが最も重要であり、問​​題のテーブルには、いくつかのクエリのを使用しています

を配置パーティショニングし、別のデータベースに古いデータを移動する間、まだ比較を発見していません挿入:

INSERT INTO ".$defaultDataTable." (
          sensor_data_type_id, 
          sequence_number, 
          value, 
          flag, 
          datetime 
         ) VALUES (
          '".Database::esc($sdtid)."', 
          '".Database::esc($valueSequence)."', 
          '".Database::esc($value)."', 
          '".Database::esc($valueSensorDataFlagsExtended)."', 
          '".Database::esc($valueDateTime)."' 
         ); 

データは、アプリケーションのいくつかのページで選択されていますが、1例は以下の通りです。

  SELECT 
       ws_sensor_data_type.sensor_data_type_id as sensor_data_type_id, 
       ws_sensor_data_type.name as sensor_data_type_name, 
       ws_sensor_data_type.equation_id as equation_id, 
       ws_sensor.name as sensor_name, 
       ws_equation.description as data_type_name, 
       ws_basestation.network_id as network_id, 
       ws_basestation.name as basestation_name, 
       ws_basestation.worldwide_id as worldwide_id, 
       ws_client.name as client_name, 
       ws_sensor.device_type_id as device_type, 
       ws_sensor.device_id as device_id 
      FROM 
       ws_sensor_data_type, 
       ws_sensor, 
       ws_basestation, 
       ws_client_basestation, 
       ws_client, 
       ws_equation 
      WHERE ws_sensor.sensor_id = ws_sensor_data_type.sensor_id 
      AND ws_sensor.basestation_id = ws_basestation.basestation_id 
      AND ws_basestation.basestation_id = ws_client_basestation.basestation_id 
      AND ws_client_basestation.client_id = ws_client.client_id 
      AND ws_sensor_data_type.equation_id = ws_equation.equation_id 
      AND ws_sensor_data_type.sensor_data_type_id = '".Database::esc($sdtid)."' 
     "); 

この例では、データとその他の情報が選択され、.CSVエクスポートファイルが作成されています。

私は現在、開発DBのコピーを作成しているので、パーティション作成をテストするためにcreate table文が続きます。

我々は問題になることはありませんUUIDのように使用しないでください。

答えて

1

です。

パーティショニングは、本質的にパフォーマンスが向上しません。非常に限られた数のユースケースしか、のパフォーマンスの改善がと表示されません。 More details

あなただけのテーブルから「最近」の行をフェッチしていて、十分なインデックスを持っている場合は、「どちらも」の答えではありません - あなたの万行は、任意のパフォーマンスを低下させることなく、億に成長できました。

あなたはUUIDを使用している場合、あなたは運命にあります。データがキャッシュされるには大きすぎると、パフォーマンスは著しく低下します。

あなたは、いくつかの「手振り」を行っています。この議論を続けたいのであれば、より詳細な情報を提供してください。 CREATE TABLE、サンプルクエリ、提案されたパーティションメカニズム、 '古い'データにアクセスするための提案されたメカニズムなど