У меня есть денормализованная таблица 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?Цени это!