Альтернативы механизму хранения MEMORY для MySQL - PullRequest
5 голосов
/ 23 марта 2009

В настоящее время я выполняю несколько интенсивных запросов SELECT к таблице MyISAM. Таблица составляет около 100 МБ (800 000 строк) и никогда не меняется.

Мне нужно увеличить производительность моего скрипта, поэтому я думал о переносе таблицы из MyISAM в механизм хранения MEMORY, чтобы я мог полностью загрузить ее в память.

Помимо механизма хранения MEMORY, каковы мои варианты загрузки таблицы 100 МБ в память?

Ответы [ 5 ]

4 голосов
/ 24 марта 2009

Таблица с 800k строками не должна быть проблемой для mysql, независимо от того, какой механизм хранения вы используете. При размере 100 МБ полная таблица (данные и ключи) должна находиться в памяти (кэш-память mysql, файловый кеш ОС или, вероятно, оба).

Сначала вы проверяете индексы. В большинстве случаев оптимизация индексов дает вам лучшее повышение производительности. Никогда не делай ничего другого, если только ты не уверен, что они в форме. Вызовите запросы, используя EXPLAIN, и проследите за случаями, когда индекс используется или неверный. Это должно быть сделано с данными реального мира, а не на сервере с тестовыми данными.

После того, как вы оптимизировали свои индексы, запросы должны заканчиваться за доли секунды. Если запросы все еще слишком медленные, просто постарайтесь не запускать их, используя кеш в вашем приложении (memcached и т. Д.). Учитывая, что данные в таблице никогда не меняются, не должно быть проблем со старыми данными кеша и т. Д.

0 голосов
/ 24 марта 2009

Если данные никогда не меняются, вы можете легко скопировать таблицу на несколько серверов баз данных.

Таким образом, вы можете перенести некоторые запросы на другой сервер, получив дополнительную передышку для основного сервера.

Повышение скорости зависит от текущей загрузки базы данных, улучшения не будет, если загрузка вашей базы данных будет очень низкой.

PS:
Вы знаете, что таблицы MEMORY забывают свое содержимое при перезапуске базы данных!

0 голосов
/ 23 марта 2009

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

MyISAM также позволяет предварительно загружать индексы таблиц MyISAM в память, используя механизм, называемый MyISAM Key Cache . После того, как вы создали кэш ключей, вы можете загрузить индекс в кэш, используя синтаксис CACHE INDEX или LOAD INDEX .

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

0 голосов
/ 23 марта 2009

Если у вас достаточно памяти, выделенной для использования Mysql - в буферном пуле Innodb или для использования MyIsam, вы можете прочитать базу данных в память (просто «SELECT * from tablename»), и если нет причин ее удалять остается там.

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

Как обычно, лучше всего сделать это, чтобы сравнить его.

Другая идея, если вы используете v5.1, использовать тип таблицы ARCHIVE, который может быть сжат, а также может ускорить доступ к содержимому, если они легко сжимаются. Это меняет процессорное время на декомпрессию для ввода-вывода / доступа к памяти.

0 голосов
/ 23 марта 2009

Предполагая, что данные редко изменяются, вы потенциально можете значительно повысить производительность запросов, используя MySql кеширование запросов .

...