Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Mysql melhora a velocidade do SELECT


reserve um tempo para ler minha resposta aqui:(tem volumes semelhantes aos seus)

500 milhões de linhas, varredura de intervalo de 15 milhões de linhas em 0,02 segundos.

MySQL e NoSQL:Ajude-me a escolher o caminho certo

em seguida, altere seu mecanismo de tabela para innodb da seguinte maneira:
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;

você pode considerar o seguinte como a chave primária:
primary key (tag_id, tag_date, value) -- added value save some I/O

mas somente se o valor não for algum tipo de varchar LARGE!

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

espero que isto ajude :)

EDITAR

oh esqueci de mencionar - não use alter table para alterar o tipo de mecanismo de mysiam para innodb, mas sim despeje os dados em arquivos csv e importe novamente para uma tabela innodb recém-criada e vazia.

note que estou ordenando os dados durante o processo de exportação - índices clusterizados são a CHAVE!

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

Importar

importe de volta para a tabela na ordem correta!
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...