Должен ли я создать таблицу Mysql, используя механизм MEMORY (HEAP) или MyISAM? - PullRequest
0 голосов
/ 12 апреля 2011

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

Таблица содержит около 10 миллионов строк и содержит около десяти столбцов INT и VARCHAR. Таблица используется только для ЧТЕНИЯ, и в ней не будет обновлений или вставок. Единственный запрос, который я делаю для таблицы:

SELECT name,age FROM myisamtable WHERE category1='example' AND (category2='example2' OR category4='example4') ORDER BY id DESC LIMIT 1000,2000

Должен ли я преобразовать таблицу в память для повышения производительности? (Мне все равно, если я потеряю таблицу при перезагрузке системы). Или лучше сохранить его как MyISAM и увеличить некоторые параметры, такие как размер буфера ключа и т. Д.?

Ответы [ 3 ]

2 голосов
/ 12 апреля 2011

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

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


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


Я задаю вопрос InnoDB. Таблицы MyISAM были удивительно эффективны для неявно доступных таблиц только для чтения. Они сосут, освобождая и повторно используя дисковые блоки и переворачивая связанные индексы.


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

1 голос
/ 12 апреля 2011

Насколько я знаю, таблица, хранящаяся в MEMORY, будет усечена, если вам не хватит памяти.

Что вы можете сделать, это создать временную таблицу с подмножеством, определенным в операторе WHERE, и выполнить последовательные запросы, используя временную таблицу. Я заметил значительное повышение производительности.

0 голосов
/ 12 апреля 2011

Использование чего-то вроде redis идеально подходит для такого рода требований к хранилищу значений ключей.

...