отделете време, за да прочетете отговора ми тук:(има подобни обеми на вашите)
500 милиона реда, 15 милиона обхват на редове сканиране за 0,02 секунди.
MySQL и NoSQL:Помогнете ми да избера правилния
след това променете вашата машина за таблица към innodb, както следва:
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;
вместо това може да разгледате следното като първичен ключ:
primary key (tag_id, tag_date, value) -- added value save some I/O
но само ако стойността не е някакъв тип LARGE varchar !
заявка както преди:
select
tag_date,
value
from
tag_date_value
where
tag_id = 1 and
tag_date between 'x' and 'y'
order by
tag_date;
надявам се това да помогне :)
РЕДАКТИРАНЕ
о, забравих да спомена – не използвайте alter table, за да промените типа на двигателя от mysiam на innodb, а по-скоро изхвърлете данните в csv файлове и повторно импортирайте в новосъздадена и празна таблица innodb.
имайте предвид, че поръчвам данните по време на процеса на експортиране - клъстерираните индекси са КЛЮЧЪТ!
Експортиране
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...
Импортиране
импортирайте обратно в таблицата в правилен ред!
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...