Кеш даних MySQL в пам'яті


11

У мене проблеми з веб-сайтом із 600 Мб бази даних MySQL. Веб-сайт занадто повільний. Я помітив, чим більше база даних MySQL отримує, тим повільніше вона проходить. Коли він становив 5 Мб, веб-сайт був дуже швидким. Коли він почав збільшуватися, він почав ставати все повільніше і повільніше, і тепер, на 600 Мб, це дуже повільно, завантажуючи сторінки, як 10 секунд.

Я перевірив основні процеси, і це нічого не пов’язане з високим навантаженням чи чим-небудь. Це навіть не пов’язано з IOPS, оскільки я тестував на HDD 7,2k об / хв накопичувачі, і це проблематика було зараз із тестуванням накопичувачів Intel 320 SSD, тому я не думаю, що це стосується і високих запитів.

На веб-сайті використовується Wordpress, і там працює як 9 плагінів. Люди сказали, що це можуть бути плагіни ... ну, можливо ... але зараз я просто хочу кешувати всю базу даних в пам'яті і хотів би отримати допомогу та вказівки щодо того, з чого почати і як це зробити.

У мене є 16 ГБ оперативної пам’яті та i5-2400 4 ядра при 3,1 ГГц. ОС - центос 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

Відповіді:


10

Якби я був ти, я переключив би всі дані на InnoDB. Блокування таблиць / блокування рядків вже давно обговорюється багатьма. Я б завжди вибирав InnoDB руками вниз. Однак є ще одна глибока причина вибору InnoDB ... КАЧІННЯ .

Хоча більшість людей похвалиться тим, що MyISAM швидше читає, більшість людей забувають, що багато кеш-пам'яті для MyISAM, який називається кеш-ключем (встановлений key_buffer_size), кешують лише індексні сторінки з файлів .MYI. Він ніколи не кешує сторінки даних. Він має офіційний максимум 4 Гб в 32-бітних системах. 8 ГБ - найкращий максимум для 64-розрядних.

Пул буфера InnoDB кешує сторінки даних та покажчики. Залежно від вашого сервера, ви можете кешувати до всього набору даних в оперативній пам'яті. Ви можете налаштувати InnoDB до 80% оперативної пам’яті та 10% для скорочення БД, а 10% залишити для ОС. Це справедливо навіть для різних операційних систем .

Я рекомендував ці речі для клієнтів Drupal з надзвичайним успіхом. Це стосується і Wordpress так само добре. Я забезпечив підтримку БД для клієнтів з WordPress. Такі ж поліпшення.

Ви завжди можете налаштувати пам'ять для InnoDB ефективніше, щоб ви могли більше MyISAM. Завжди є спосіб налаштувати InnoDB відповідно до ваших потреб . Коли ваші дані зростають, вони з часом стануть необхідною умовою .

ОНОВЛЕННЯ 2011-11-21 11:44 EST

Якщо ваш повний набір даних досить малий, ви можете виконати SELECT-запит у кожній таблиці, яку ви маєте відразу після запуску mysql.

Для всіх таблиць, які є InnoDB та / або MyISAM, запустіть цей запит:

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
;

Це виведе кожен можливий SELECT запит, який потрібно запустити, і викликає всі індекси, на які потрібно посилатися. Розмістіть цей запит у файлі під назвою /root/MakeSelectQueriesToLoad.sql. Запустіть скрипт і збирайте вихід /root/SelectQueriesToLoad.sql. Нарешті, запустіть його:

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

Це, безумовно, попередньо завантажить усі індексні сторінки в буфер InnoDB і пул кеш-ключа MyISAM. Якщо всі ваші дані є InnoDB, внесіть дві зміни:

  • замінити WHERE engine IN ('InnoDB','MyISAM')наWHERE engine='InnoDB'
  • замінити CONCAT('SELECT ',ndxcollist,' FROM ',наCONCAT('SELECT * FROM ',

Це також заповнить більше сторінок даних у буфер InnoDB.

ЗАКЛЮЧНА ПРИМІТКА: Переконайтеся, що пул буфера InnoDB є достатньо великим, щоб вмістити всі ваші дані InnoDB


2

Ви вже кешуєте всю базу даних в пам'яті. Проблема майже напевно - це час, який потрібно для пошуку бази даних, навіть в оперативній пам'яті.

Перегляньте статистику вводу / виводу вашого диска. Напевно ви побачите, що є лише випадкові випадкові бітові введення / виведення диска. База даних знаходиться в пам'яті. Це не проблема. Вам потрібно спочатку встановити iostat. Ви не згадуєте про свою платформу чи розповсюдження, але це, мабуть, у пакеті під назвою iostat. Ви можете знайти atopбільш привітні.

Невже люди, які вам сказали це зробити, отримавши будь-які докази того, що вся ваша база даних вже не була в пам’яті чи проблема вводу / виводу диска? Інакше їх порада - еквівалент лікаря, який ніколи вас не бачив і не оглядав, але щойно чув, що болить ваша рука, яка говорить вам про те, щоб поставити на неї роль.


-1

Встановіть хороший плагін кешування для Wordpress, це може допомогти. Але рано чи пізно вам доведеться з’ясувати вузьке місце, яке уповільнює вашу систему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.