neem de tijd om mijn antwoord hier te lezen:(heeft vergelijkbare volumes als die van jou)
500 miljoen rijen, scan van 15 miljoen rijen in 0,02 seconden.
MySQL en NoSQL:help me de juiste te kiezen
pas dan je table engine als volgt aan naar 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;
u zou in plaats daarvan het volgende als de primaire sleutel kunnen beschouwen:
primary key (tag_id, tag_date, value) -- added value save some I/O
maar alleen als de waarde niet een GROOT varchar-type is!
vraag als voorheen:
select
tag_date,
value
from
tag_date_value
where
tag_id = 1 and
tag_date between 'x' and 'y'
order by
tag_date;
hoop dat dit helpt :)
BEWERKEN
oh vergeten te vermelden - gebruik geen alter-tabel om het motortype van mysiam naar innodb te wijzigen, maar dump de gegevens liever in csv-bestanden en importeer ze opnieuw in een nieuw gemaakte en lege innodb-tabel.
let op ik bestel de gegevens tijdens het exportproces - geclusterde indexen zijn de SLEUTEL!
Exporteren
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...
Importeren
importeer terug in de tabel in de juiste volgorde!
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...