MySQL INSERT в таблице базы данных блокирует SELECTS в другой базе данных и в другой таблице

Я использую MySQL 5.1 на компьютере под управлением Windows Server 2008 R2 с 8 ГБ ОЗУ.

Я обновляю 2 базы данных еженедельно. Обе базы данных состоят из таблиц MyISAM, и я запускаю скрипт, который выполняет необходимые INSERT (без UPDATE /DELETE) для некоторых таблиц (таблица gp ниже содержит более 370 000 000 строк).

В какой-то момент во время выполнения сценария mysql (весь процесс занимает около 2,5 часов), я вижу, что операторы SELECT, которые выполняются одновременно с INSERT (НО в разных таблицах и даже в разных базах данных), "блокируются" и просто повесьте, пока весь процесс вставки не закончится.

Одна вставка вставит около 50-60 пар целых чисел в таблицу gp, и это может занять до 2-4 секунд (весь процесс будет иметь около 2000-4000 каждого из них). Таким образом, если во время ВСТАВКИ есть 10 ВЫБОРОВ, все они помещаются в очередь, как показано в ШОУ ПРОЦЕССЛИСТЕ ниже.

Id User Host             db  Command Time State         Info

35 root localhost:36954  db  Query   1    update        INSERT INTO db_2.gp VALUES(@g,669313116),(@g,...),... (@g is an integer variable and there would normally be about 50-60 pairs of values here)
42 root localhost:38019  db  Query   113  Sending data  SELECT * FROM db.g WHERE ...

Этот SHOW PROCESSLIST был запущен при локальном тестовом запуске сценария, но такое же поведение можно заметить на сервере LIVE при его обновлении. Я не знаю, почему блокируются SELECT (выше есть только 1 SELECT, поскольку он исходил от localhost, но на сервере LIVE может быть много разных SELECT, поставленных в очередь из пользовательских запросов).

В приведенном выше списке процессов видно, что INSERT выполняется для таблицы gp в базе данных db_2, а оператор SELECT выполняется для таблицы g в базе данных db. Итак, это разные таблицы (и в разных базах данных), поэтому я не вижу, почему здесь возникает проблема с блокировкой.

Можно ли как-нибудь сделать так, чтобы INSERT не блокировал SELECT? Пожалуйста, не говорите мне использовать InnoDB вместо этого, поскольку я попробовал это, и сайт значительно замедлился. Мне нужно продолжать использовать MyISAM.

1 ответ

INSERT не "блокирует" SELECTв приведенном вами примере процесса. Почти наверняка происходит то, что INSERT занимает целую кучу ввода / вывода, голодая SELECT доступа к диску необходимо завершить отправку данных клиенту.

Другие вопросы по тегам