2010-08-07 6 views
10

Mam aplikację e-commerce, która używa MySQL i chciałbym, aby była szybsza. Po uzyskaniu dostępu do części # na stronie internetowej, do której dostęp został wcześniej uzyskany, część wczytuje się szybko, ponieważ wszystkie niezbędne dane znajdują się już w puli buforów INNODB. Jeśli jednak część # nigdy wcześniej nie była załadowana, dane nie znajdują się jeszcze w puli buforów, więc należy ją odczytać z dysku, i to powoli. Ustawiłem pulę buforów INNODB na 2 GB, a cała ta baza danych to tylko około 350 MB, więc jest dużo miejsca na załadowanie całej bazy danych w puli buforów. Z statystyk INNODB wynika, że ​​w tej chwili używana jest tylko połowa puli buforów.Jak wstępnie załadować tabele do puli buforów INNODB za pomocą MySQL?

Znalazłem odniesień do wstępnego ładowania danych, znane również jako „rozgrzewkę” puli buforów, takich jak Quickly preloading Innodb tables in the buffer pool lub mysqldump.azundris.com/archives/70-Innodb-cache-preloading-using-blackhole .html. Strategia polega głównie na wymuszeniu skanowania tabeli na każdej tabeli, ponieważ MySQL nie ma natywnego sposobu wstępnego ładowania danych.

Nie chcę ręcznie tworzyć skryptów, które wymieniają każdą tabelę w mojej bazie danych i muszę to zrobić. W jaki sposób mogę utworzyć skrypt, który przechodzi automatycznie i dokonuje selekcji dla każdej tabeli automatycznie, i automatycznie wybiera nieindeksowaną kolumnę, aby wykonać skanowanie tabeli?

Odpowiedz

0

To zapytanie zwróci nazwy tabel w bazie danych, dzięki czemu nie trzeba ich ręcznie wejściowego:

SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'database name' 

Następnie dla każdej nazwy tabeli skanowanie tabeli siła.

22

To powinno dać Ci listę zapytań do uruchomienia;)

SELECT 
    CONCAT('SELECT ',MIN(c.COLUMN_NAME),' FROM ',c.TABLE_NAME,' WHERE ',MIN(c.COLUMN_NAME),' IS NOT NULL') 
FROM 
    information_schema.COLUMNS AS c 
LEFT JOIN (
    SELECT DISTINCT 
    TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME 
    FROM 
    information_schema.KEY_COLUMN_USAGE 
) AS k 
USING 
    (TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME) 
WHERE 
    c.TABLE_SCHEMA = 'yourDatabase' 
    AND k.COLUMN_NAME IS NULL 
GROUP BY 
    c.TABLE_NAME 

Można umieścić go w procedurze przechowywanej, i przejść przez wynikowego z kursorem. Utwórz przygotowane polecenie z każdego wiersza i wykonaj.

+3

Ten algorytm jest po prostu zwięzły i genialny. Spowoduje to buforowanie danych innodb. Nie jestem pewien, czy spowoduje to buforowanie wszystkich stron indeksu innodb, ale twój algorytm można szybko zastosować do tego. Wierzę, że MyISAM buforuje tylko strony indeksu MYI. Ponownie, twój algorytm stanowi podstawę do przechodzenia przez tabele i indeksy. Bravo (i +1) !!!! – RolandoMySQLDBA

+1

Kopalnia jest tylko implementacją, aby uzyskać listę zapytań. Pomysł pochodzi z bloga Mysql Performance połączonego z pytaniem. – Mchl

Powiązane problemy