Кэш базы данных MySQL в памяти

11

У меня проблемы с сайтом с базой данных MySQL 600 МБ. Сайт работает слишком медленно. Я заметил, что чем больше база данных MySQL, тем медленнее она идет. Когда это было 5 МБ, сайт был очень быстрым. Когда он начал увеличиваться, он начал становиться все медленнее и медленнее, и теперь, на 600 МБ, он действительно медленный, и загрузка страниц занимает около 10 секунд.

Я проверил главные процессы, и это не имеет ничего общего с высокой нагрузкой или чем-то еще. Он даже не связан с IOPS, так как я тестировал жесткие диски на жестких дисках с частотой вращения 7,2 тыс. Оборотов в минуту, и теперь у меня возникла та же проблема с тестированием на SSD-накопителях Intel 320, так что я не думаю, что речь идет о высоких запросах.

Веб-сайт использует 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 ... CACHING .

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

InnoDB Buffer Pool кэширует данные и страницы индекса. В зависимости от вашего сервера, вы можете кэшировать до всего набора данных в оперативной памяти. Вы можете настроить 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

RolandoMySQLDBA
источник
2

Вы уже кэшируете всю базу данных в памяти. Проблема почти наверняка заключается в времени, которое требуется для поиска в базе данных, даже в оперативной памяти.

Следите за статистикой дискового ввода-вывода. Вы, вероятно, увидите, что это случайный бит дискового ввода-вывода. База данных находится в памяти. Это не проблема. Вы должны установить в iostatпервую очередь. Вы не упоминаете свою платформу или дистрибутив, но, вероятно, это пакет iostat. Вы можете найти atopболее дружелюбным.

Были ли люди, которые сказали вам это, после получения каких-либо доказательств того, что вся ваша база данных еще не была в памяти или что дисковый ввод-вывод был проблемой? В противном случае, их совет эквивалентен доктору, который никогда не видел и не осматривал вас, а только слышал, что у вас болит рука, и велит вам наложить на него слепок.

Пол Уайт 9
источник
-1

Установите хороший плагин кэширования для Wordpress, это может помочь. Но рано или поздно вы должны выяснить узкое место, которое замедляет вашу систему.

fzsa
источник