Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL verbessert die SELECT-Geschwindigkeit

Nehmen Sie sich Zeit, meine Antwort hier zu lesen:(hat ähnliche Bände wie Sie)

500 Millionen Zeilen, 15 Millionen Zeilenbereichsscan in 0,02 Sekunden.

MySQL und NoSQL:Helfen Sie mir, das Richtige auszuwählen

dann ändern Sie Ihre Tabellen-Engine wie folgt in 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;

Sie könnten stattdessen Folgendes als Primärschlüssel betrachten:

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

aber nur, wenn der Wert kein GROSSER Varchar-Typ ist!

Abfrage wie zuvor:

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

hoffe das hilft :)

BEARBEITEN

oh vergessen zu erwähnen - verwenden Sie nicht alter table, um den Enginetyp von mysiam auf innodb zu ändern, sondern geben Sie die Daten in CSV-Dateien aus und importieren Sie sie erneut in eine neu erstellte und leere innodb-Tabelle.

Beachten Sie, dass ich die Daten während des Exportvorgangs bestelle - gruppierte Indizes sind der SCHLÜSSEL!

Exportieren

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

Importieren

in der richtigen Reihenfolge wieder in die Tabelle importieren !

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