2009-03-23 4 views
5

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

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

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

+0

запустите «SHOW CREATE TABLE» на своем столе и опубликуйте результат, чтобы мы могли видеть структуру таблицы и индексы , Некоторые примеры запросов SELECT также должны быть хорошими. –

+0

http://dba.stackexchange.com/questions/1811/what-are-reasons-not-to-use-the-memory-storage-engine-in-mysql – zloctb

ответ

4

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

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

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

0

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

+1

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

0

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

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

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

+0

Я уже оптимизировал таблицу и свои запросы. Моя структура таблицы что-то похожее на это: ID Имя Фамилия возраст, пол, номер улицы города состояние ... И большинство моих запросов выглядеть следующим образом: SELECT FROM таблицы WHERE имя столбца = «параметра поиска» –

0

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

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

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

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

0

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

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

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

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