MySQL Cluster намного медленнее, чем InnoDB - PullRequest
1 голос
/ 02 октября 2010

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

1 Ответ

2 голосов
/ 02 октября 2010

Вам нужно выбрать правильный движок хранения для вашего приложения.

myISAM - часто читайте / пишите редко.Идеально подходит для поиска данных в больших таблицах.Достаточно хорошо справляется со сложными индексами и вполне подходит для пакетных перезагрузок.

MEMORY - хорош для быстрого доступа к относительно небольшим и простым таблицам.

InnoDB - хорош для обработки транзакций.Также хорошо для смешанной рабочей нагрузки чтения / записи.

NDB - относительно менее зрелый.Хорошо для отказоустойчивости.

Сервер MySQL по своей природе не является многопроцессорным программным обеспечением.Таким образом, добавление ядер не обязательно приведет к снижению производительности.Хорошим хостом для MySQL является приличная двухъядерная система с большим количеством оперативной памяти и самыми быстрыми дисковыми каналами ввода-вывода и дисками, которые вы можете себе позволить.НЕ помещайте ваши файлы данных mySQL в сетевую или общую файловую систему, если вы не заботитесь о производительности запросов.

Если вы работаете в Linux, введите эти две команды (на компьютере, на котором работает сервер MySQL).) чтобы узнать, записываете ли вы все свои процессоры или записываете все операции ввода-вывода на диск:

sar -u 1 10
sar -d 1 10

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

Редактировать Это восьмилетний латар, и этот ответ теперь в основном устарел.

...