У меня есть денормализованная таблица product с примерно 6 миллионами строк (~ 2 ГБ) в основном для поиска. Поля включают price, color, unitprice, weight, ...
У меня есть индексы BTREE для color и т. д. Условия запроса динамически генерируются из Интернета, например
select count(*)
from product
where color = 1 and price > 5 and price < 100 and weight > 30 ... etc
а также
select *
from product
where color = 2 and price > 35 and unitprice < 110
order by weight
limit 25;
Раньше я использовал InnoDB, пробовал таблицы MEMORY и переключился на NDB, надеясь, что больше одновременных запросов можно будет выполнять быстрее. У меня есть 2 таблицы с одинаковой схемой, индексами и данными. Один — InnoDB, а другой — NDB. Но результаты очень разочаровывают: для упомянутых выше запросов InnoDB примерно в 50 раз быстрее, чем NDB. Это примерно 0,8 секунды против 40 секунд. Для этого теста я многократно выполнял только один запрос на выборку. Запросы InnoDB и NDB используют один и тот же индекс в color.
Я использую mysql-5.1.47 ndb-7.1.5 на двух процессорах Xeon 5506 (всего 8 ядер), 32 ГБ памяти под управлением CentOS 5. Я установил 2 узла данных NDB, один узел MGM и один узел MYSQL на одном компьютере. Для каждого узла я выделил около 9 ГБ памяти, а также пробовал MaxNoOfExecutionThreads=8, LockPagesInMainMemory, LockExecuteThreadToCPU и многие другие параметры конфигурации, но безуспешно. Пока NDB выполнял запрос, моя пиковая загрузка ЦП составляла около 200%, т. е. были заняты только 2 из 8 ядер. Большую часть времени это было похоже на 100%. Я использовал ndbmtd и проверил в журнале узла данных, что потоки LQH действительно были созданы. Я также пытался объяснить, профилировать - это просто показало, что Sending data отнимало большую часть времени. Я также просмотрел некоторые документы по настройке Mysql Cluster, доступные в Интернете, которые не очень помогли в моем случае.
Кто-нибудь может пролить свет на это? Есть ли лучший способ настроить базу данных NDB? Ценить это!