Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Mysql poprawia SELECT prędkość

poświęć trochę czasu na przeczytanie mojej odpowiedzi tutaj:(ma podobne tomy do Twojej)

500 milionów wierszy, skanowanie zakresu 15 milionów wierszy w 0,02 sekundy.

MySQL i NoSQL:pomóż mi wybrać właściwy

następnie zmień silnik tabel na innodb w następujący sposób:

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;

zamiast tego możesz rozważyć następujące klucze:

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

ale tylko wtedy, gdy wartość nie jest jakimś DUŻYM typem varchar!

zapytanie jak poprzednio:

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

mam nadzieję, że to pomoże :)

EDYTUJ

zapomniałem wspomnieć - nie używaj alter table do zmiany typu silnika z mysiam na innodb, ale raczej zrzuć dane do plików csv i zaimportuj je ponownie do nowo utworzonej i pustej tabeli innodb.

uwaga zamawiam dane podczas procesu eksportu - indeksy klastrowe to KLUCZ!

Eksportuj

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

Importuj

importuj z powrotem do tabeli we właściwej kolejności!

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak MySQL przechowuje wyliczenia?

  2. mysql_insert_id z aktualizacją

  3. jak dostosować `show processlist` w mysql?

  4. Dlaczego liczby całkowite w krotce wiersza bazy danych mają sufiks „L”?

  5. Wstawianie kodu html do tabeli mysql