Pekerjaan saya saat ini menggunakan MySQL (MyISAM) khusus untuk semua penyimpanan data. Saat ini kami memiliki lebih dari 300 server web dan sekitar 150 database. Sayangnya saya harus menulis struktur tabel untuk mendukung lebih dari 100 juta baris dalam jangka waktu 30 hari. Idenya adalah:
- Sisipan bervolume tinggi (tidak ada pembaruan atau penghapusan dan selalu berada di akhir tabel)
- 1 baris dipilih
- Data yang lebih lama dari 30 hari akan dibuang
Solusi terbaik tampaknya adalah menggabungkan tabel untuk setiap hari menjadi tabel Gabung untuk pilihan. Memang akan ada data duplikat, tetapi SELECT hanya akan menarik baris terbaru berdasarkan stempel waktu dan bidang int. Jelas memiliki 30 meja tidaklah ideal tetapi begitu pula kehidupan.
Apakah ada kelemahan yang melekat pada pendekatan ini? Apakah ada cara lain untuk melakukan pendekatan ini yang saya lewatkan (kita terjebak di 5.0)? Apakah penguncian tabel akan menjadi masalah besar saat melakukan ALTER TABLE pada tabel gabungan saat tabel hari baru dibuat? Saat ini kami memiliki struktur rotasi tabel, tetapi jika kami menggunakan satu tabel, harus memilih data yang kami inginkan dari tabel lama ke tabel baru akan sangat lambat karena mendekati 100 juta baris.
Ada teknologi lain di luar sana untuk mencapai hal ini dengan cara yang elegan, namun tim penjualan kami telah menjual solusinya dan kami tidak memiliki banyak waktu.
Masukan apa pun akan dihargai.
Struktur:
CREATE TABLE `merge_test_1` (
`date_stamp` long NOT NULL,
`hash` char(32) NOT NULL,
`p_id` mediumint(8) unsigned NOT NULL,
`a_id` mediumint(8) unsigned NOT NULL,
`b_id` mediumint(8) unsigned NOT NULL,
PRIMARY KEY (`hash`,`p_id`,`date_stamp`)
) ENGINE=MyISAM
Contoh kueri
SELECT b_id,a_id FROM merge_test WHERE hash='1' AND p_id=1
ORDER BY date_stamp DESC LIMIT 1