SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.09.2008 12:02:43

shutdown
Завсегдатай
Зарегистрирован: 29.05.2008
Сообщений: 46

FEDERATED, быстрое обновление индексов

Можно ли для FEDERATED с индексированными полями реализовать оптимизацию по скорости большого количества вставок аналогично приему:

lock table `table` write;
insert into `table` ....
...
unlock tables;

Насколько я понимаю, в чистом виде это не сделать, т.к. блокировки действуют только на том сервере, где выполняются, т.е. если блокировать на источнике, то все равно поток вставок на приемнике будет "дергать" индексы на каждую вставку. С другой стороны, если блокировать на приемнике, то на источнике вставка будет заблокирована, т.к. запросы на блокировку и вставку располагаются в разных потоках.
Подскажите, как оптимальнее сделать, если нужно сливать в одну FEDERATED-таблицу с нескольких серверов. От индексов отказываться не хотелось бы. (они для insert ignore нужны, чтобы не было дубликатов)
Или, может, есть красивое решение для избавления от дубликатов на следующем шаге после добавления записей? Тогда можно было бы отказаться от индексов на этапе вставки.
Спасибо.

Неактивен

 

#2 09.09.2008 12:15:42

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: FEDERATED, быстрое обновление индексов

Насколько я понимаю, Вы в любом случае будете дергать индекс на каждую вставку.
По крайней мере, Ваш пример никак не ограничивает использование индексов.

А что Вас смущает в простой вставке в таблицу?

Неактивен

 

#3 09.09.2008 14:57:37

shutdown
Завсегдатай
Зарегистрирован: 29.05.2008
Сообщений: 46

Re: FEDERATED, быстрое обновление индексов

paulus написал:

Насколько я понимаю, Вы в любом случае будете дергать индекс на каждую вставку.
По крайней мере, Ваш пример никак не ограничивает использование индексов.

А что Вас смущает в простой вставке в таблицу?

Может, плохо объяснил суть, но, как известно, в простейшем случае (без блокировок) при каждой вставке будет пересчитываться индекс.
Блокировки же позволяют обновить индекс один раз после unlock tables.
Не помню точно как влияет на это дело autocommit (может, подскажете заодно ?)

Неактивен

 

#4 09.09.2008 15:06:28

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: FEDERATED, быстрое обновление индексов

Транзакции с FEDERATED невозможны. Также как и блокировки. Перестройка индекса - не очень долгая операция, но на производительность влиять может. Слово FEDERATED и слово производительность не стоит употреблять в рамках одного предложения smile

Для MyISAM работает еще ALTER TABLE DISABLE KEYS; ALTER TABLE ENABLE KEYS, но для FEDERATED не думаю, что это уместно.

Попробуйте multiple insert, то есть вставку многих строк одним оператором INSERT

Неактивен

 

#5 09.09.2008 20:17:33

shutdown
Завсегдатай
Зарегистрирован: 29.05.2008
Сообщений: 46

Re: FEDERATED, быстрое обновление индексов

rgbeast написал:

...Перестройка индекса - не очень долгая операция, но на производительность влиять может...

А при перестройке индекс сбрасывается на диск? Или по обстоятельствам, в зависимости от того, находится ли страница с индексом в памяти?
Вообще, у меня вставка в пустую таблицу. Где будет наращиваться индекс - в памяти или на диске?

Для MyISAM работает еще ALTER TABLE DISABLE KEYS; ALTER TABLE ENABLE KEYS, но для FEDERATED не думаю, что это уместно.

Вот, кстати, очень хорошая идея. Я буду применять это для таблицы-приемника, а она как раз MyISAM.

Попробуйте multiple insert, то есть вставку многих строк одним оператором INSERT

У меня insert into ... select *. К тому же, насколько я понял, пакетные вставки (предложенный Вами muliple insert) преобразуются (для FEDERATED) в отдельные запросы, верно? А как насчет моего случая?

В общем, при отключенных индексах вполне приемлемая производительность. Я работаю с этой таблицей на стороне приемника, она мне нужна только чтобы собрать воедино данные с нескольких узлов. Просто пока за один раз заливается порядка 600К записей (после обработки таблица чистится), производительность приемлемая. Но объемы будут расти, нужны все инструменты оптимизации.

Неактивен

 

#6 09.09.2008 23:36:22

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: FEDERATED, быстрое обновление индексов

Удаляйте индексы как класс DROP INDEX, вставляйте данные и затем ADD INDEX, это будет работать в любой конфигурации.

Про работу индекса, см. иллюстрацию http://slady.net/java/bt/view.php?w=600&h=450 индекс должен обновится на диске (или в дисковом кэше), но изменения локальны. См. также тему: http://sqlinfo.ru/forum/viewtopic.php?id=29

Неактивен

 

#7 10.09.2008 11:05:18

shutdown
Завсегдатай
Зарегистрирован: 29.05.2008
Сообщений: 46

Re: FEDERATED, быстрое обновление индексов

Полностью убрать индексы при вставке не получится - остается 1 уникальный, чтобы фильтровать дубликаты. Скорость даже при наличии этого ключа приемлемая, за исключением моментов, когда происходит обращение к диску (я так понимаю, сбрасывается индексный буфер). Это очень хорошо видно на графике KeyEfficiency в MySQL Administrator. В эти моменты запрос select count(*) from  для таблицы-приемника как бы подвисает и резко снижается прирост новых записей. Когда идет работа с памятью - все гладко и равномерно вставляется. В связи с этим вопрос: можно ли как-то влиять на размер этого временного буфера, чтобы снизить вероятность обращения к диску?

Неактивен

 

#8 10.09.2008 11:16:21

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: FEDERATED, быстрое обновление индексов

Есть механизм KEY CACHE (в MyISAM): http://dev.mysql.com/doc/refman/5.1/en/ … cache.html
Можно увеличить key_buffer_size, тогда индексы будут работать быстрее. На запись это не должно влиять, так как после изменения индекс должен быть записан на диск (не целиком, а тот блок, который обновился). Здесь поможет только дисковый кеш операционной системы.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson