luangkan waktu untuk membaca jawaban saya di sini:(memiliki volume yang mirip dengan milik Anda)
500 juta baris, 15 juta rentang baris memindai dalam 0,02 detik.
MySQL dan NoSQL:Bantu saya memilih yang benar
kemudian ubah mesin tabel Anda menjadi innodb sebagai berikut:
create table tag_date_value
(
tag_id smallint unsigned not null, -- i prefer ints to chars
tag_date datetime not null, -- can we make this date vs datetime ?
value int unsigned not null default 0, -- or whatever datatype you require
primary key (tag_id, tag_date) -- clustered composite PK
)
engine=innodb;
Anda dapat mempertimbangkan yang berikut ini sebagai kunci utama:
primary key (tag_id, tag_date, value) -- added value save some I/O
tetapi hanya jika nilainya bukan tipe varchar BESAR!
kueri seperti sebelumnya:
select
tag_date,
value
from
tag_date_value
where
tag_id = 1 and
tag_date between 'x' and 'y'
order by
tag_date;
semoga membantu :)
EDIT
oh lupa menyebutkan - jangan gunakan tabel ubah untuk mengubah jenis mesin dari mysiam ke innodb melainkan buang data ke dalam file csv dan impor ulang ke tabel innodb yang baru dibuat dan kosong.
perhatikan saya memesan data selama proses ekspor - indeks berkerumun adalah KUNCInya!
Ekspor
select * into outfile 'tag_dat_value_001.dat'
fields terminated by '|' optionally enclosed by '"'
lines terminated by '\r\n'
from
tag_date_value
where
tag_id between 1 and 50
order by
tag_id, tag_date;
select * into outfile 'tag_dat_value_002.dat'
fields terminated by '|' optionally enclosed by '"'
lines terminated by '\r\n'
from
tag_date_value
where
tag_id between 51 and 100
order by
tag_id, tag_date;
-- etc...
Impor
impor kembali ke tabel dalam urutan yang benar !
start transaction;
load data infile 'tag_dat_value_001.dat'
into table tag_date_value
fields terminated by '|' optionally enclosed by '"'
lines terminated by '\r\n'
(
tag_id,
tag_date,
value
);
commit;
-- etc...