2009-09-12 4 views
3

Мы запускаем сервер 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 укомплектовать перегрузки наш сервер и как я могу это предотвратить?

С уважением,

+3

В SQL Server выполнение SELECT ... INTO (та же концепция, что и CREATE TABLE ... SELECT) блокирует всю исходную таблицу, в результате чего очереди других запросов. Это по дизайну. Подобное поведение в MySQL возможно. Поскольку я тоже не знаю MySQL, я не поставил это на правильный ответ. – 2009-09-12 12:13:07

+0

Похоже, это может быть так - http://www.mysqlperformanceblog.com/2006/07/12/insert-into-select-performance-with-innodb-tables/. Я собираюсь провести некоторое тестирование в понедельник. – Paso

+0

Если вы хотите, чтобы ваш комментарий был принят как правильный ответ, повторите отправку его в качестве ответа. – Paso

ответ

1

Возможно, это будет причиной?

Примечание: DROP TABLE автоматически фиксирует текущую активную транзакцию, если вы не используете ключевое слово TEMPORARY.

(http://dev.mysql.com/doc/refman/5.1/en/drop-table.html)

+0

Спасибо, я изменю транзакцию, чтобы включать только инструкции CREATE TABLE и ALTER TABLE. Однако я не вижу, как это могло бы стать источником моих проблем, поскольку это только оператор CREATE TABLE, который перегружает сервер, и что один из них сам по себе не должен извлекать выгоду из эффективности транзакций, верно? – Paso

 Смежные вопросы

  • Нет связанных вопросов^_^