не могу обновить запись, застрять - PullRequest
12 голосов
/ 02 января 2012

У меня проблема с моей текущей базой данных mysql.

У меня более 100 соединений, ожидающих выбранной записи.когда я выполняю:

show processlist;

запрос на выборку - это большой запрос, а остальные - более простые запросы и вставки, обновления.

у меня есть одна база данных со 100 таблицами, и выборка использует 5joins.

есть ли способ временно остановить процесс и позволить другим процессам запускаться, как только все процессы завершены, тогда выбор может продолжить работу?

Ответы [ 3 ]

12 голосов
/ 11 января 2012

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

Верны BookOfZeus и tfb785Во-первых, у вас, вероятно, ошибки индексов.объяснение расскажет вам, в чем именно проблема и что искать.например, если у вас есть 5 объединений, и вы получите количество строк, например, 100 000 и 100, а также 1 и 1 и 1, вы умножите 100 000 * 100, что может быть очень медленным.

внимательно прочитайте, что объясняет объяснение, и оптимизируйтеВаш запрос основан на этом.

innodb может быть хорошим вариантом, если вы обращаетесь к таблицам очень часто, потому что его блокировка строк заменена блокировкой таблиц для myisam.

Я бы сказал, сначала попытайтесь оптимизировать ваш запрос, может быть, выВам не нужно менять движок таблицы, чтобы решить проблему.если у вас все еще есть проблемы, вы можете перейти на innodb.

4 голосов
/ 10 января 2012

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

Первый способ: Изменить уровень изоляции http://dev.mysql.com/doc/refman/5.6/en/mysql-acid.html Это также может означать, что вы должны изменить свой механизм хранения, например. в InnoDB.

Второй способ: Попробуйте ускорить ваш длительный выбор с индексами. Это так называемый компромисс памяти времени. Вы ускоряете свой запрос, используя больше памяти для хранения деревьев индексов.

Третий способ: Ускорьте ваш долгосрочный выберите с перестановкой запроса (объединяет и выбирает). Проанализируйте стоимость всех частей запроса.

4 голосов
/ 02 января 2012

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

Я полагаю, вы используетеMyISAM в качестве механизма хранения.

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

Нет способа остановить запрос SELECTВы спрашиваете: записи могут сделать возвращенный набор записей несоответствующим.Хотя в вашей настройке это может быть не тот случай, и теоретически запись может не повлиять на чтение (скажем, чтение и запись различных записей), MyISAM не знает об этом и на всякий случай всегда блокирует целые таблицы.

Если вам нужны записи, чтобы не блокировать чтения, переключитесь на InnoDB (хотя бывают случаи, когда записи также блокируют чтения).

...