MySQL InnoDB: индексные блокировки - необходим совет - PullRequest
2 голосов
/ 18 июля 2011

У меня есть приложение, которое отправляет вызовы функций в мою базу данных mySQL.После отправки функция делает то, что ей нужно (включая выбор одной строки, INSERT и UPDATE по индексу).

Сейчас я могу делать около миллиона вызовов MySQL в день.Эти вызовы функций mySQL разбиты на фактические «вызовы» моего приложения, которые могут быть от 1 до 20 различных вызовов функций mySQL.Мое приложение получает около 120 000 «вызовов функций приложения» в день.

У меня 12 гигабайт оперативной памяти, поэтому я увеличил объем оперативной памяти InnoDB с 2 до 8 гигабайт, и это, похоже, не увеличилось.Далее я решил, что если 1 поток получает столько, добавление потоков увеличит его.Итак, я сделал это, и теперь я вижу тонны и тонны ошибок блокировки индекса.

Я знаю, что MySQL говорит, что нужно просто повторно отправить запрос, что работает, но я не вижу значительного увеличения скорости.Я в основном добиваюсь 180 000 «вызовов функций приложения» на моем конце независимо от потоков, когда однопоточность составляла около 120 000.Это потому, что когда-то у меня около 2-3 потоков, постоянные ошибки блокировки потоков.

Теперь у каждой из моих таблиц есть тонны индексов для эффективности поиска, поскольку у меня миллионы строк.Тем не менее, я планирую реплицировать эту базу данных, чтобы новый экземпляр выполнял большую часть поиска на SLAVE, в то время как основные данные хранятся на моем MASTER (который является всеми обновлениями / вставками).Из-за этого я подумал, может быть, удаление всех индексов на MASTER, кроме первичного ключа и уникальных ключей, уменьшит это?Тогда я мог бы добавить индексы на РАБЕ.Однако я даже не уверен, сработает ли это, используя базовую функцию mySQL REPLICATION, если индексы разные, поскольку это моя первая попытка его использования.

Любое предложение о том, что мне следует сделать, чтобы сделать это более эффективным.Сейчас MySQL обрабатывает примерно 1/20 от того, что мне нужно в данный день.

Я ценю любые отзывы.

Ответы [ 3 ]

0 голосов
/ 19 июля 2011

Какую версию MySQL вы используете?Последние версии MySQL значительно улучшили параллелизм InnoDB.Вы также можете попробовать сборки Percona MySQL .

Не могли бы вы также рассказать подробнее о структуре вашей таблицы и о том, как именно выглядят ваши запросы?Когда вы говорите INSERT и UPDATE по индексу, вы имеете в виду первичный ключ или вторичный индекс?

0 голосов
/ 19 июля 2011

1 - Возможно, вам следует попробовать разбить ваши таблицы.Это уменьшит размер частей индекса, которые необходимо заблокировать.

2 - http://www.youtube.com/watch?v=Oon06s9dXrY

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

4 - по возможности добавить уровень кэша в ваше приложение

0 голосов
/ 19 июля 2011

Вам нужно профилировать свои запросы, чтобы убедиться, что они максимально эффективны. Используйте встроенный процесс описания плана выполнения (EXPLAIN или визуализатор плана выполнения в MySQL Management Console), чтобы помочь вам выяснить, где находятся ваши запросы.

С точки зрения аппаратных решений, если вы не выполняете полностью оперативную память, рассмотрите возможность обновления вашего диска до SSD; предоставляемая ими пропускная способность может быть очень значительной (например, IOPS на 2 порядка больше, чем при вращающейся ржавчине).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...