Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mysql améliore la vitesse de SELECT

prenez le temps de lire ma réponse ici :(a des volumes similaires aux vôtres)

500 millions de lignes, balayage de plage de 15 millions de lignes en 0,02 seconde.

MySQL et NoSQL :aidez-moi à choisir le bon

puis modifiez votre moteur de table en innodb comme suit :

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;

vous pourriez plutôt considérer ce qui suit comme clé primaire :

primary key (tag_id, tag_date, value) -- added value save some I/O

mais seulement si la valeur n'est pas un type LARGE varchar !

requête comme avant :

select
 tag_date, 
 value
from
 tag_date_value
where
 tag_id = 1 and
 tag_date between 'x' and 'y'
order by
 tag_date;

j'espère que ça aide :)

MODIFIER

oh j'ai oublié de mentionner - n'utilisez pas alter table pour changer le type de moteur de mysiam à innodb mais plutôt vider les données dans des fichiers csv et les réimporter dans une table innodb nouvellement créée et vide.

notez que je commande les données pendant le processus d'exportation - les index clusterisés sont la clé !

Exporter

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...

Importer

réimporter dans la table dans le bon ordre !

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...