Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL:Memisahkan tabel besar menjadi partisi atau tabel terpisah?

Nah, jika Anda mengharapkan jawaban baru, itu berarti Anda mungkin telah membaca jawaban saya, dan saya terdengar seperti kaset rusak. Lihat Blog partisi untuk beberapa kasus penggunaan di mana partisi dapat membantu kinerja. Milik Anda tidak terdengar seperti salah satu dari 4 kasus.

Kecilkan device_id . INT adalah 4 byte; apakah Anda benar-benar memiliki jutaan perangkat? TINYINT UNSIGNED adalah 1 byte dan rentang 0..255. SMALLINT UNSIGNED adalah 2 byte dan kisaran 0..64K. Itu akan sedikit mengecilkan tabel.

Jika Anda asli pertanyaannya adalah tentang bagaimana mengelola begitu banyak data, lalu mari "berpikir di luar kotak". Baca terus.

Grafik... Rentang tanggal berapa Anda membuat grafik?

  • Jam/hari/minggu/bulan/tahun 'terakhir'?
  • Jam/hari/minggu/bulan/tahun yang berubah-ubah?
  • Rentang yang berubah-ubah, tidak terikat dengan batas hari/minggu/bulan/tahun?

Apa yang Anda buat grafiknya?

  • Nilai rata-rata dalam sehari?
  • Maks/menit dalam sehari?
  • Lilin (dll) untuk hari atau minggu atau apa pun?

Terlepas dari kasusnya, Anda harus membuat (dan secara bertahap memelihara) Tabel Ringkasan dengan data. Baris akan berisi info ringkasan selama satu jam. Saya akan menyarankan

CREATE TABLE Summary (
    device_id SMALLINT UNSIGNED NOT NULL,
    sensor_id TINYINT UNSIGNED NOT NULL,
    hr TIMESTAMP NOT NULL,
    avg_val FLOAT NOT NULL,
    min_val FLOAT NOT NULL,
    max_val FLOAT NOT NULL
    PRIMARY KEY (device_id, sensor_id, hr)
) ENGINE=InnoDB;

Satu tabel Ringkasan mungkin berukuran 9 GB (untuk jumlah data saat ini).

SELECT hr,
       avg_val,
       min_val,
       max_val
    FROM Summary
    WHERE device_id = ?
      AND sensor_id = ?
      AND hr >= ?
      AND hr  < ? + INTERVAL 20 DAY;

Akan memberi Anda nilai hi/lo/avg selama 480 jam; cukup untuk membuat grafik? Mengambil 480 baris dari tabel ringkasan jauh lebih cepat daripada mengambil 60*480 baris dari tabel data mentah.

Mendapatkan data serupa selama satu tahun mungkin akan mencekik paket grafik, jadi mungkin layak untuk membuat ringkasan ringkasan -- dengan resolusi sehari. Ini akan menjadi sekitar 0,4 GB.

Ada beberapa cara berbeda untuk membuat tabel Ringkasan; kita dapat mendiskusikannya setelah Anda merenungkan keindahannya dan membaca Blog ringkasan tabel . Mungkin mengumpulkan data selama satu jam, lalu menambah tabel Ringkasan, adalah cara terbaik. Itu akan seperti flip-flop yang dibahas blog tabel Staging saya .

Dan, jika Anda memiliki ringkasan per jam, apakah Anda benar-benar membutuhkan data menit demi menit? Pertimbangkan untuk membuangnya. Atau, mungkin data setelah, katakanlah, satu bulan. Itu mengarah pada penggunaan partisi, tetapi hanya untuk manfaatnya dalam menghapus data lama seperti yang dibahas dalam "Kasus 1" dari Blog partisi . Artinya, Anda akan memiliki partisi harian, menggunakan DROP dan REORGANIZE setiap malam untuk menggeser waktu tabel "Fakta". Ini akan menyebabkan penurunan jejak 145GB Anda, tetapi tanpa kehilangan banyak data. Jejak baru:Sekitar 12 GB (Ringkasan per jam + detail menit demi menit 30 hari terakhir)

PS:Blog Tabel Ringkasan menunjukkan cara mendapatkan simpangan baku.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menghubungkan ke DB Mysql dengan C# - Perlu beberapa dengan Kumpulan Data

  2. Nama tabel sensitivitas huruf MySQL di MacOS dengan sistem file tidak peka huruf besar-kecil

  3. Bagaimana Fungsi LOWER() Bekerja di MySQL

  4. MySQL GROUP OLEH ... MEMILIKI nilai yang berbeda bidang yang sama

  5. Menggunakan php filter_var dengan mysql_real_escape_string