В нашей производственной базе данных каждый час выполнялся следующий пакетный запрос псевдокода SQL:
INSERT INTO TemporaryTable
(SELECT FROM HighlyContentiousTableInInnoDb
WHERE allKindsOfComplexConditions are true)
Теперь этот запрос сам по себе не должен быть быстрым, но я заметил, что он блокировал HighlyContentiousTableInInnoDb
, хотя он просто читал его. Который делал некоторые другие очень простые запросы, занимал ~ 25 секунд (это время, которое требуется для выполнения другого запроса).
Затем я обнаружил, что таблицы InnoDB в таком случае фактически заблокированы SELECT! http://www.mysqlperformanceblog.com/2006/07/12/insert-into-select-performance-with-innodb-tables/
Но мне не очень нравится решение в статье выбора в OUTFILE, это похоже на взлом (временные файлы на файловой системе кажутся сочными). Любые другие идеи? Есть ли способ сделать полную копию таблицы InnoDB, не блокируя ее таким образом во время копирования. Затем я мог просто скопировать HighlyContentiousTable
в другую таблицу и выполнить там запрос.