(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. GunakanFLOATbiasa (yang tampaknya 'benar' untuk metrik seperti voltase) atau gunakanDECIMAL(m,n).FLOATadalah 4 byte; dalam kasus yang diberikan,DECIMALakan menjadi 3 atau 4 byte. -
Bila Anda memiliki keduanya
INDEX(a)danINDEX(a,b), yang pertama tidak diperlukan karena yang terakhir dapat menutupinya. Anda memiliki 3 KUNCI yang tidak perlu. Ini memperlambatINSERTs. -
INT(3)-- Apakah Anda mengatakan "angka 3 digit"? Jika demikian, pertimbangkanTINYINT UNSIGNED(nilai 0..255) untuk 1 byte sebagai gantiINTuntuk 4 byte. Ini akan menghemat banyak MB ruang disk, karenanya kecepatan. (Lihat jugaSMALLINT, dll, danSIGNEDatauUNSIGNED.) -
Jika
filenamesering diulang, Anda mungkin ingin "menormalkan" itu. Ini akan menghemat banyak MB. -
Gunakan
NOT NULLkecuali Anda membutuhkanNULLuntuk sesuatu. -
AUTO_INCREMENT=690892041menyiratkan bahwa Anda sekitar 1/3 dari jalan menuju bencana denganid, yang akan mencapai sekitar 2 miliar. Apakah Anda menggunakaniduntuk apa saja? Menyingkirkan kolom akan menghindari masalah; dan ubahUNIQUE KEYkePRIMARY KEY. (Jika Anda membutuhkanid, 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' dariPRIMARY KEYakan lebih mempercepat iniSELECTsecara signifikan. (Dan mungkin atau mungkin tidak memperlambatSELECTlainnya .)
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.