MySQL Cluster намного медленнее, чем InnoDB

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


person QWJ QWJ    schedule 02.10.2010    source источник
comment
Должен ли вопрос заключаться в том, что MySQL Cluster намного медленнее, чем Innodb?   -  person Martin    schedule 02.10.2010
comment
Какие индексы определены для ваших таблиц?   -  person Martin    schedule 03.10.2010
comment
индекс, используемый как в innodb, так и в ndb, один и тот же, 'color', типа int(11).   -  person QWJ QWJ    schedule 03.10.2010


Ответы (1)


arrow_upward
3
arrow_downward

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

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

ПАМЯТЬ -- подходит для быстрого доступа к относительно небольшим и простым таблицам.

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

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

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

Если вы работаете в Linux, введите эти две команды (на машине, на которой работает сервер mySQL), чтобы увидеть, сжигаете ли вы весь свой процессор или записываете все дисковые операции ввода-вывода:

sar -u 1 10
sar -d 1 10

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

Изменить Прошло восемь лет, и этот ответ в основном устарел.

person O. Jones    schedule 02.10.2010
comment
Спасибо за информацию. Я использовал sar, а также vmstat, top, iostat и т. д. для мониторинга нагрузки. В большинстве случаев загрузка ЦП ниже 20%, и 40-секундный одиночный выбор невелик. В то время как для innodb я смог отправить множество запросов, чтобы получить постоянную загрузку ЦП на уровне 90–95% в течение длительного периода времени. Может быть, мне стоит пока вернуться к InnoDB... - person QWJ QWJ; 03.10.2010
comment
Все узлы данных, узел MGM, узел SQL находятся в одном поле. Как проверить загрузку сети? Спасибо! - person QWJ QWJ; 04.10.2010
comment
И я полагаю, что вся обработка данных для этих запросов должна быть ограничена узлами данных - здесь не так много сетевой передачи. - person QWJ QWJ; 04.10.2010
comment
!!! Если есть смысл в кластеризации, то это использование нескольких машин для запуска базы данных, чтобы повысить производительность. Если вы запускаете много кластерных заметок на одном поле, они должны взаимодействовать и синхронизироваться при каждом обновлении данных. Попробуйте просмотреть /sbin/ifconfig lo0, чтобы получить подсчет IP-трафика локального хоста. Еще лучше использовать более простую настройку сервера базы данных, например myISAM или InnoDB. - person O. Jones; 05.10.2010
comment
Да, это всего лишь оценка NDB перед фактическим развертыванием на ней многосерверного продукта. Я думал, что у моей коробки достаточно ресурсов для запуска 2 узлов данных, и, по крайней мере, производительность NDB должна быть такой же хорошей, как у InnoDB. Кроме того, разве lo0 не должен быть быстрее, чем Ethernet? Если lo0 здесь является узким местом, то почему 1-гигабитный коммутатор/Ethernet лучше работает в многосерверной среде? - person QWJ QWJ; 06.10.2010
comment
Этот ответ очень устарел. myISAM больше не поддерживается. Также рекомендуется использовать только один сервер, потому что его будет легче поддерживать, что является ужасной практикой с системной точки зрения. - person Paul Dejean; 10.09.2018