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