2009-07-11 11 views
14

Pewnego dnia podejrzewam, że będę musiał nauczyć się hadoop i przenieść wszystkie te dane do niestrukturalnej bazy danych, ale jestem zaskoczony, że wydajność tak spada w tak krótkim czasie czasu.Wydajność Mysql na stole z 6 milionami wierszy

Mam tabelę mysql z niewiele poniżej 6 milionów wierszy. Zrobiłem bardzo proste zapytanie na tej tabeli i uważam, że mam wszystkie prawidłowe indeksy w miejscu.

zapytanie jest

 
SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date 

wyjaśniania zwrotów

 
id select_type  table type possible_keys key  key_len  ref  rows Extra 
1 SIMPLE updateshows  range date_idx date_idx 7 NULL 648997 Using where 

więc używam poprawnego indeksu o ile mogę powiedzieć, ale ta kwerenda jest podejmowanie 11 sekund do uruchomienia.

Baza danych to MyISAM, a phpMyAdmin podaje, że tabela ma 1,0GiB.

Wszelkie pomysły tutaj?

Edytowane: Data_idx indeksuje zarówno kolumny daty i venid. Czy powinny to być dwa oddzielne indeksy?

+0

Jakie masz indeksy? – Pafjo

+0

Twoje zapytanie wyjaśniające mówi, że musi przeskanować 648997 wierszy (Prawdopodobnie nie użyje indeksów wystarczająco skutecznie, będę indeksować kolumny dokładnie, czy to ja). Ile wierszy zostało faktycznie zwróconych? – nos

+0

Jaki jest teraz status –

Odpowiedz

38

Co chcesz mieć pewność, że zapytanie będzie używać TYLKO indeksu, więc upewnij się, że indeks obejmuje wszystkie pola, które wybierasz. Ponadto, ponieważ jest to zapytanie zakresu, musisz najpierw umieścić żył w indeksie, ponieważ jest on pytany jako stała. Dlatego powinienem utworzyć i zindeksować tak:

ALTER TABLE events ADD INDEX indexNameHere (venid, date, time); 

Przy pomocy tego indeksu wszystkie informacje potrzebne do wykonania zapytania znajdują się w indeksie. Oznacza to, że, miejmy nadzieję, mechanizm przechowywania danych jest w stanie pobrać informacje bez konieczności szukania w samej tabeli. Jednak MyISAM może nie być w stanie tego zrobić, ponieważ nie przechowuje danych w liściach indeksów, więc możesz nie uzyskać pożądanego wzrostu prędkości. W takim przypadku spróbuj utworzyć kopię tabeli i użyj silnika InnoDB na kopii. Powtórz te same kroki i sprawdź, czy uzyskasz znaczny wzrost prędkości. InnoDB robi zapisuje wartości pól w liście indeksu i pozwala na indeksy obejmujące.

Teraz mam nadzieję, że zobaczysz następujące po wyjaśnić zapytanie:

mysql> EXPLAIN SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date; 

id select_type table type possible_keys  key  [..] Extra 
1 SIMPLE events range date_idx, indexNameHere indexNameHere Using index, Using where 
+4

+1: indeksy pokrywające są niezbędne. Dzięki starannym indeksom i ostrożnym zapytaniom wiersze 6 mm to nic wielkiego. –

+3

NIESAMOWITE !! Dziękuję Ci. Nie zdawałem sobie sprawy, że muszę pokryć pola SELECTED indeksem. Myślałem, że to tylko pola WHERE, które trzeba zindeksować. – pedalpete

+1

jeśli pamiętasz, jaki był czas wykonania nowego zapytania z indeksem? –

2

spróbuj dodać klucz, który obejmuje venid i datę (lub na odwrót, albo oba ...)

+0

Kiedy mówisz "dodaj klucz", masz na myśli indeks? Zmieniłem swój wpis, aby stwierdzić, że data_idx znajduje się zarówno w polach daty, jak i pola żywiołów. – pedalpete

+0

Będziesz potrzebować 'time', też –

+0

Dzięki Michael, nie zdawałem sobie sprawy, że pola SELECT również powinny być indeksowane. Twoje zdrowie. – pedalpete

1

Spróbuj umieścić indeksu na kolumnie venid.

+0

Właśnie edytowałem swój wpis, data_idx znajduje się zarówno w polach daty, jak i pola żywiołów. Przepraszam, że nie wstawiłem tego oryginalnie. – pedalpete

2

Mogę sobie wyobrazić, że wiersz tabeli 6M powinien móc być optymalizowane z całkiem normalnych technik.

Zakładam, że masz dedykowany serwer bazy danych i ma on rozsądną ilość pamięci RAM (na przykład minimum 8G).

Musisz upewnić się, że dostroiłeś mysql, aby efektywnie wykorzystywał twój ram. Jeśli używasz 32-bitowego systemu operacyjnego, nie rób tego. Jeśli korzystasz z MyISAM, ustaw swój kluczowy bufor tak, aby używał znaczącej proporcji, ale nie zbyt dużej wartości twojego ramka.

W każdym przypadku chcesz przeprowadzić powtarzalne testy wydajności na sprzęcie produkcyjnym.

+0

Dzięki @MarkR i przepraszam za bardzo spóźnioną odpowiedź. To była druga strona, którą kiedykolwiek zbudowałem, więc nie miałem pojęcia o dedykowanych serwerach db czy cokolwiek podobnego. Przeprowadziłem go przez kilka lat z wszystkimi procesami na tym samym pudełku. Żadnych problemów, byłem zaskoczony, jak dobrze MySQL skalowane do 8 milionów + wierszy. Zarchiwizowałem starsze dane, kiedy dotarły do ​​tego punktu. – pedalpete

Powiązane problemy