Скорость MySQL обновления / установки оператора. Умножение столбца - PullRequest
3 голосов
/ 12 мая 2009

У меня есть миллион строк в таблице MySql "temp", и я хочу умножить столбец "t" (int без знака, проиндексированный) на 1000.

mysql> update temp set t=1000*t;

Этот процесс занимает 25 секунд. Тот же оператор для неиндексированного столбца занимает 10 секунд;

Есть идеи, как сделать этот процесс быстрее? Я должен применить это к более чем 1-5 таблицам.

Ответы [ 2 ]

2 голосов
/ 12 мая 2009

Вы можете включить или выключить индексирование после обновления

ALTER TABLE tbl_name DISABLE KEYS;
ALTER TABLE tbl_name ENABLE KEYS;

Или, если вы используете myISAM Вы можете использовать флаг delay_key_write. Вы можете установить его для каждой таблицы, или во всем мире. Вы можете использовать команду «FLUSH TABLE mytable» для принудительного запуска mysql обновить копию индексов на диске.

http://dev.mysql.com/doc/mysql/en/create-table.html

http://dev.mysql.com/doc/mysql/en/myisam-start.html

http://dev.mysql.com/doc/mysql/en/flush.html

1 голос
/ 12 мая 2009

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

Операция UPDATE == IO - это ваше узкое место. Получите более быстрые диски.

Если вы используете InnoDB, мой единственный совет будет посмотреть, если настройка innodb_flush_log_at_trx_commit и установка его в 2 помогает вашей производительности, но я сомневаюсь, что это всего лишь 1 запрос. Отключение ключей и их повторное включение после UPDATE не будет работать в InnoDB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...