Мы запускаем сервер MySQL с умеренной нагрузкой (200-300 QPS) на довольно мощное оборудование (HP DL360 с 8 ядрами Xeon, оперативной памятью 8 ГБ и RAID10). Все таблицы являются innodb и активный набор данных вписывается в выделенный innodb_buffer_pool_size
.CREATE TABLE AS SELECT kill MySQL
Наша база данных нормализована и для уменьшения количества объединений мы используем материализованные представления для выравнивания набора данных. Поскольку данные добавляются партиями несколько раз в день, MV: s восстанавливаются с использованием CREATE TABLE AS SELECT
вместо динамического обновления с использованием сложных триггеров.
Проблема заключается в том, что иногда в то время как эти CREATE
запросы выполняются (каждый из которых имеет ничего от 5 до 50 секунд) и другие несвязанные запросы к серверу, кажется, чтобы получить в очереди за CREATE
запроса, что приводит к зависания базы данных.
К (ре) порождают MV: s мы используем что-то вроде этого:
BEGIN TRANSACTION;
DROP TABLE IF EXISTS TableName_TMP;
CREATE TABLE TableName_TMP ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci AS
SELECT about100columns, and10Expressions
FROM Table1
JOIN Table2 ON Table1.fk = Table2.pk
/* join up to 13 other tables */
WHERE ((removed IS NULL OR removed = 0))
ORDER BY created DESC, id ASC;
ALTER TABLE TableName_TMP ADD PRIMARY KEY(id), INDEX(created);
DROP TABLE IF EXISTS TableName;
ALTER TABLE TableName_TMP RENAME TO TableName;
COMMIT;
Explain, в SELECT, производит что-то вроде:
+----+-------------+------------------+-------------+---------------+------------+---------+------------------------------+-------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+-------------+---------------+------------+---------+ ------------------------------+-------+-----------------------------+
| 1 | SIMPLE | Table1 | ref_or_null | removed | removed | 5 | const | 76093 | Using where; Using filesort |
| 1 | SIMPLE | Table2 | eq_ref | PRIMARY | PRIMARY | 4 | Table1.fk1 | 1 | |
| 1 | SIMPLE | Table3 | eq_ref | PRIMARY | PRIMARY | 4 | Table1.fk2 | 1 | |
/* More of the same */
| 1 | SIMPLE | TableN | eq_ref | PRIMARY | PRIMARY | 4 | TableM.fk | 1 | Using index |
| 1 | SIMPLE | TableX | eq_ref | PRIMARY | PRIMARY | 4 | TableY.fk | 1 | |
/* More of the same */
+----+-------------+------------------+-------------+---------------+------------+---------+------------------------------+-------+-----------------------------+
Любые идеи, почему CREATE TABLE AS
укомплектовать перегрузки наш сервер и как я могу это предотвратить?
С уважением,
В SQL Server выполнение SELECT ... INTO (та же концепция, что и CREATE TABLE ... SELECT) блокирует всю исходную таблицу, в результате чего очереди других запросов. Это по дизайну. Подобное поведение в MySQL возможно. Поскольку я тоже не знаю MySQL, я не поставил это на правильный ответ. – 2009-09-12 12:13:07
Похоже, это может быть так - http://www.mysqlperformanceblog.com/2006/07/12/insert-into-select-performance-with-innodb-tables/. Я собираюсь провести некоторое тестирование в понедельник. – Paso
Если вы хотите, чтобы ваш комментарий был принят как правильный ответ, повторите отправку его в качестве ответа. – Paso