(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. GunakanFLOAT
biasa (yang tampaknya 'benar' untuk metrik seperti voltase) atau gunakanDECIMAL(m,n)
.FLOAT
adalah 4 byte; dalam kasus yang diberikan,DECIMAL
akan 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 gantiINT
untuk 4 byte. Ini akan menghemat banyak MB ruang disk, karenanya kecepatan. (Lihat jugaSMALLINT
, dll, danSIGNED
atauUNSIGNED
.) -
Jika
filename
sering diulang, Anda mungkin ingin "menormalkan" itu. Ini akan menghemat banyak MB. -
Gunakan
NOT NULL
kecuali Anda membutuhkanNULL
untuk sesuatu. -
AUTO_INCREMENT=690892041
menyiratkan bahwa Anda sekitar 1/3 dari jalan menuju bencana denganid
, yang akan mencapai sekitar 2 miliar. Apakah Anda menggunakanid
untuk apa saja? Menyingkirkan kolom akan menghindari masalah; dan ubahUNIQUE KEY
kePRIMARY 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 KEY
akan lebih mempercepat iniSELECT
secara signifikan. (Dan mungkin atau mungkin tidak memperlambatSELECT
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.