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

Bisakah saya mengatur Mysql ke partisi otomatis?

(Jawaban ini diarahkan pada skema dan PILIH.)

Karena Anda mengantisipasi jutaan baris, pertama-tama saya ingin menunjukkan beberapa perbaikan pada skema.

  • FLOAT(m,n) biasanya merupakan hal yang 'salah' untuk dilakukan karena mengarah pada dua pembulatan. Gunakan FLOAT biasa (yang tampaknya 'benar' untuk metrik seperti voltase) atau gunakan DECIMAL(m,n) . FLOAT adalah 4 byte; dalam kasus yang diberikan, DECIMAL akan menjadi 3 atau 4 byte.

  • Bila Anda memiliki keduanya INDEX(a) dan INDEX(a,b) , yang pertama tidak diperlukan karena yang terakhir dapat menutupinya. Anda memiliki 3 KUNCI yang tidak perlu. Ini memperlambat INSERTs .

  • INT(3) -- Apakah Anda mengatakan "angka 3 digit"? Jika demikian, pertimbangkan TINYINT UNSIGNED (nilai 0..255) untuk 1 byte sebagai ganti INT untuk 4 byte. Ini akan menghemat banyak MB ruang disk, karenanya kecepatan. (Lihat juga SMALLINT , dll, dan SIGNED atau UNSIGNED .)

  • Jika filename sering diulang, Anda mungkin ingin "menormalkan" itu. Ini akan menghemat banyak MB.

  • Gunakan NOT NULL kecuali Anda membutuhkan NULL untuk sesuatu.

  • AUTO_INCREMENT=690892041 menyiratkan bahwa Anda sekitar 1/3 dari jalan menuju bencana dengan id , yang akan mencapai sekitar 2 miliar. Apakah Anda menggunakan id untuk apa saja? Menyingkirkan kolom akan menghindari masalah; dan ubah UNIQUE KEY ke PRIMARY KEY . (Jika Anda membutuhkan id , mari kita bicara lebih jauh.)

  • ENGINE=MyISAM -- Switching memiliki beberapa konsekuensi, baik yang menguntungkan maupun yang tidak menguntungkan. Meja akan menjadi 2-3 kali lebih besar. Pilihan 'benar' dari PRIMARY KEY akan lebih mempercepat ini SELECT secara signifikan. (Dan mungkin atau mungkin tidak memperlambat SELECT lainnya .)

Catatan di SELECT :Sejak string dan unit_num adalah konstanta dalam kueri, dua bidang terakhir ORDER BY timestamp asc, string asc, unit_num asc tidak perlu. Jika relevan karena alasan yang tidak terlihat di SELECT , maka saran saya mungkin tidak lengkap.

Ini

WHERE filename = 'foobar'
  AND unit_num='40'
  AND string='2' 
  AND timestamp >= ...

ditangani secara optimal oleh INDEX(filename, unit_name, string, timestamp) . Urutan kolom tidak penting kecuali timestamp . itu harus terakhir . Menata ulang UNIQUE saat ini kunci, Anda memberi Anda indeks optimal. (Sementara itu, tidak ada indeks yang sangat bagus untuk SELECT . ini .) Menjadikan PRIMARY KEY dan tabel InnoDB akan membuatnya lebih cepat.

Mempartisi? Tidak ada keuntungan. Bukan untuk kinerja; bukan untuk hal lain yang telah Anda sebutkan. Penggunaan umum untuk mempartisi adalah untuk membersihkan 'lama'. Jika Anda berniat untuk melakukan itu, mari kita bicara lebih jauh.

Dalam tabel besar, yang terbaik adalah melihat semua SELECTs yang penting secara bersamaan sehingga kita tidak mempercepat satu sementara menghancurkan kecepatan yang lain. Itu mungkin bahkan ternyata partisi membantu dalam pertukaran semacam ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengurutkan waktu ( Dalam AM / PM ) dalam SQL?

  2. Lewati sisipan pada entri duplikat di mysql

  3. Bekerja dengan Pemicu di Database MySQL - Sebuah Tutorial

  4. Tidak dapat menginstal mysqlclient di centos

  5. Haruskah saya melakukan ping ke server mysql sebelum setiap kueri?