Buforuj bazę danych MySQL w pamięci

11

Mam problemy z witryną z 600 MB bazy danych MySQL. Strona jest zbyt wolna. Zauważyłem, że im większa baza danych MySQL, tym wolniej. Kiedy było 5 MB, strona była bardzo szybka. Kiedy zaczęło się powiększać, zaczęło być coraz wolniejsze i teraz, przy 600 MB, jest naprawdę wolne, zajmuje około 10 sekund, aby załadować strony.

Sprawdziłem najlepsze procesy i nie ma to nic wspólnego z dużym obciążeniem lub czymkolwiek. Nie jest to nawet związane z IOPS, ponieważ testowałem na dyskach HDD o prędkości 7.2k rpm i dało ten sam problem teraz z testowaniem na dyskach Intel 320 SSD, więc nie sądzę, że dotyczy to również wysokich zapytań.

Strona korzysta z Wordpress i aktywnych jest około 9 wtyczek. Ludzie mówili, że to mogą być wtyczki ... no cóż ... ale teraz chcę tylko buforować całą bazę danych w pamięci i chciałbym uzyskać pomoc i wskazówki, od czego zacząć i jak to zrobić.

Mam 16 GB pamięci RAM i 4 rdzenie i5-2400 przy 3,1 GHz. OS to centos 5.7

top - 07:23:57 up 9 days, 12:15, 0 users, load average: 0.09, 0.04, 0.05
Tasks: 162 total, 1 running, 161 sleeping, 0 stopped, 0 zombie
Cpu(s): 8.2%us, 1.0%sy, 0.0%ni, 90.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16367532k total, 3641628k used, 12725904k free, 612140k buffers
Swap: 1046520k total, 0k used, 1046520k free, 1538896k cached
udzielić krawca
źródło

Odpowiedzi:

10

Gdybym był tobą, przestawiłbym wszystkie dane na InnoDB. Blokowanie tabel / blokowanie wierszy było od dawna dyskutowane przez wielu. Zawsze wybrałbym InnoDB bez użycia rąk. Istnieje jednak inny głęboki powód, aby wybrać InnoDB ... CACHING .

Podczas gdy większość ludzi chwali się tym, że MyISAM jest szybszy do odczytu, większość zapomina, że ​​wiele pamięci podręcznej dla MyISAM, która nazywa się pamięcią podręczną kluczy (ustawioną przez key_buffer_size), buforuje tylko strony indeksu z plików .MYI. Nigdy nie buforuje stron danych. Ma oficjalnie maksymalnie 4 GB w systemach 32-bitowych. 8 GB to najlepsze maksimum dla wersji 64-bitowej.

Pula buforów InnoDB buforuje dane i strony indeksowe. W zależności od posiadanego serwera możesz buforować do całego zestawu danych w pamięci RAM. Możesz dostroić InnoDB do 80% RAM i 10% dla DB Conenctions, i pozostawić 10% dla OS. Dotyczy to nawet różnych systemów operacyjnych .

Polecam te rzeczy klientom Drupala ze wspaniałym sukcesem. Dotyczy to również Wordpress . Zapewniłem obsługę DB dla klientów z WordPress. Te same ulepszenia.

Zawsze możesz skonfigurować pamięć dla InnoDB bardziej efektywnie niż MyISAM. Zawsze istnieje sposób na dostosowanie programu InnoDB do własnych potrzeb w zakresie wydajności . W miarę wzrostu ilości danych staną się one w końcu wymogiem .

AKTUALIZACJA 21.11.2011 11:44 EST

Jeśli Twój kompletny zestaw danych jest wystarczająco mały, możesz wykonać zapytanie SELECT w każdej tabeli, którą masz zaraz po uruchomieniu mysql.

Dla wszystkich tabel, które są InnoDB i / lub MyISAM, uruchom następujące zapytanie:

SELECT DISTINCT
    CONCAT('SELECT ',ndxcollist,' FROM ',
    db,'.',tb,' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
FROM (
    SELECT
        engine,table_schema db,table_name tb,index_name,
        GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
    FROM (
        SELECT
            B.engine,A.table_schema,A.table_name,
            A.index_name,A.column_name,A.seq_in_index
        FROM
            information_schema.statistics A INNER JOIN
            (SELECT engine,table_schema,table_name
            FROM information_schema.tables
            WHERE engine IN ('InnoDB','MyISAM')) B
            USING (table_schema,table_name)
        WHERE
            B.table_schema NOT IN ('information_schema','mysql')
            AND A.index_type <> 'FULLTEXT'
        ORDER BY
            table_schema,table_name,index_name,seq_in_index
        ) A
    GROUP BY
        table_schema,table_name,index_name
) AA
ORDER BY
    engine DESC,db,tb
;

Spowoduje to wyświetlenie każdego możliwego zapytania SELECT, które należy uruchomić, które przywoła wszystkie indeksy, do których istnieje odwołanie. Umieść to zapytanie w pliku o nazwie /root/MakeSelectQueriesToLoad.sql. Uruchom skrypt i zbierz dane wyjściowe /root/SelectQueriesToLoad.sql. Na koniec uruchom:

mysql -u... -p... -AN < /root/MakeSelectQueriesToLoad.sql > /root/SelectQueriesToLoad.sql
mysql -u... -p... < /root/SelectQueriesToLoad.sql

To z pewnością wstępnie załaduje wszystkie strony indeksu do puli buforów InnoDB i pamięci podręcznej kluczy MyISAM. Jeśli wszystkie twoje dane to InnoDB, wprowadź dwie zmiany:

  • wymienić WHERE engine IN ('InnoDB','MyISAM')zWHERE engine='InnoDB'
  • wymienić CONCAT('SELECT ',ndxcollist,' FROM ',zCONCAT('SELECT * FROM ',

Spowoduje to również wypełnienie większej liczby stron danych w puli buforów InnoDB.

UWAGA KOŃCOWA: Upewnij się, że pula buforów InnoDB jest wystarczająco duża, aby pomieścić wszystkie dane InnoDB

RolandoMySQLDBA
źródło
2

Już buforujesz całą bazę danych w pamięci. Problemem jest prawie na pewno czas przeszukiwania bazy danych, nawet w pamięci RAM.

Obserwuj statystyki we / wy dysku. Prawdopodobnie zobaczysz, że od czasu do czasu jest tylko losowy bit we / wy dysku. Baza danych jest w pamięci. To nie jest problem. iostatNajpierw musisz zainstalować . Nie wspominasz o swojej platformie ani dystrybucji, ale prawdopodobnie jest to pakiet o nazwie iostat. Możesz znaleźć atopbardziej przyjazny.

Czy osoby, które Ci to powiedziały, zrobiły to po uzyskaniu jakichkolwiek dowodów na to, że cała baza danych nie była już w pamięci lub że problem dotyczy wejścia / wyjścia dysku? W przeciwnym razie ich rada jest odpowiednikiem lekarza, który nigdy cię nie widział ani nie badał, ale właśnie usłyszał, że boli cię ręka, każąc ci ją rzucić.

Paul White 9
źródło
-1

Zainstaluj dobrą wtyczkę buforującą dla Wordpress, może to pomóc. Ale prędzej czy później musisz znaleźć wąskie gardło, które spowalnia Twój system.

fzsa
źródło