Mysql Lock времена в медленном журнале запросов - PullRequest
0 голосов
/ 16 ноября 2011

У меня есть приложение, которое уже довольно давно работает нормально, но недавно в медленном журнале запросов появилось несколько пунктов.Все запросы - сложные и уродливые операторы выбора нескольких соединений, которые могут использовать рефакторинг.Я полагаю, что у всех есть капли, то есть они записываются на диск.Часть, которая заставляет меня любопытно, - то, почему у некоторых из них есть время блокировки, связанное с ними.Ни один из запросов не имеет конкретных протоколов блокировки, установленных приложением.Насколько я знаю, по умолчанию вы можете читать против блокировок, если явно не указано.

, поэтому мой вопрос: какие сценарии приводят к тому, что оператор select должен ожидать блокировки (и, следовательно, сообщаться в медленном запросежурнал)?Предположим, что обе среды INNODB и MYISAM.

Может ли взаимодействие с диском быть указано как какое-то время блокировки?Если да, есть ли документация, в которой об этом говорится?

заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 ноября 2011

MyISAM создаст вам проблемы с параллелизмом, когда во время вставки вся таблица будет полностью заблокирована.

У InnoDB не должно быть проблем с чтением, даже когда выполняется запись / транзакция из-за MVCC.

Однако то, что запрос отображается в журнале медленных запросов, не означает, что запрос медленный - сколько секунд, сколько записей проверяется?

Поставьте «EXPLAIN» перед запросом, чтобы получить разбивку экзаменов, проводимых по запросу.

вот хороший ресурс для изучения EXPLAIN (кроме превосходной документации MySQL по этому поводу)

0 голосов
/ 16 ноября 2011

Я не уверен насчет MySql, но я знаю, что в SQL Server операторы select НЕ читаются против блокировок.Это позволит вам прочитать незафиксированные данные и, возможно, увидеть повторяющиеся записи или полностью пропустить запись.Причина этого в том, что, если другой процесс записывает данные в таблицу, ядро ​​базы данных может решить, что пришло время реорганизовать некоторые данные и перенести их на диск.Таким образом, он перемещает запись, которую вы уже прочитали, в конец, и вы видите ее снова, или он перемещает одну запись в конец выше, где вы уже прошли.

В сети где-то есть парень, который фактически написалпару сценариев, чтобы доказать, что это происходит, и я попробовал их один раз, и потребовалось всего несколько секунд, прежде чем появился дубликат.Конечно, он разработал сценарии таким образом, чтобы это было более вероятным, но это доказывает, что это определенно может произойти.

Это нормальное поведение, если ваши данные не должны быть точными и могутбезусловно, поможет предотвратить тупики.Однако, если вы работаете с приложением, работающим с чем-то вроде денег людей, это очень плохо.

В SQL Server вы можете использовать подсказку WITH NOLOCK, чтобы сказать вашему оператору select игнорировать блокировки.Я не уверен, каким будет эквивалент в MySql, но, может быть, кто-то еще скажет.

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