SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 20.09.2011 18:19:24

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Медленная работа скрипта для импорта

Добрый день. Есть скрипт для импорта товаров в БД.
Обычный Импорт\експорт через тот же дамп - не подходит, структура системы не позволяет, потому надо извращаться, но вопрос не в этом.
Сам скрипт состоит из процедуры и функции, реализующих логику, и последующего обращения к ним с разными параметрами ( с уникальным кодом продукта)
1)

CREATE FUNCTION touchProduct (_BrandName VARCHAR(255),_ProductHandler VARCHAR(255), _Description TEXT) RETURNS INTEGER(11)

Проверяет, есть ли продукт, если есть - возвращает его ИД, если нет - создает (присваивая внутренний спец код)
2)
CREATE PROCEDURE touchValue (_ProductId INTEGER(11),_ParameterName VARCHAR(64), _Value TEXT)

Проверяет, есть ли у продукта указанное значение и в зависимости от данных - либо создает его, либо заменяет на новое, либо не трогает.

Дальше идет блок из такого рода запросов
SET @ProductId = touchProduct ('Acer','LX.PW502.004', '');
call touchValue(@ProductId,'Decsription','Genuine Windows® 7 Home Premium -  64-bit version - Intel® Core™ i5-520UM processor 1.06GHz with Turbo Boost Technology up to 1.');
call touchValue(@ProductId,'Image','http://static.acer.com/up/Resource/Acer/Notebooks/Aspire Series/Images/20101209/Aspire_350x250.jpg');
call touchValue(@ProductId,'Model','AS1430-4857');



Все таблицы в innodb.
Всего в скрипт попадает около 90К продуктов, + 5-30 разных значений к нему.
В итоге такой скрипт под виндой (вин сервер 2008, mysql Ver 14.14 Distrib 5.5.11, for Win64 (x86)) отрабатывает больше 10 часов.
Пробовал отключать проверку ключаей и автокоммит транзакций (сам комитил через каждые 100 продуктов) - ничего не поменялось. Куда копать?



При этом этот же скрипт в убунте отрабатывает меньше, чем за час
mysql  Ver 14.14 Distrib 5.1.41, for debian-linux-gnu (i486) using readline 6.1

Отредактированно YAAP (20.09.2011 19:03:35)

Неактивен

 

#2 20.09.2011 21:13:36

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Медленная работа скрипта для импорта

Тестить нужно ...

Откуда запускается скрипт ?
Как выглядит сам скрипт ?
Какая часть скрипта берёт сколько время ?
Содержимое touchProduct и touchValue ?
EXPLAIN и PROFILING запросов.
my.snf и конфигурации серверов ...

Неактивен

 

#3 20.09.2011 22:41:34

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Re: Медленная работа скрипта для импорта

1) Откуда запускается скрипт ?
Запускается из консоли в обоих случаях через mysql -u ... < script.sql

2) Как выглядит сам скрипт ?
Я описал. 2 функции, потом постоянный обращения к ним
В аттаче - первые 200 строк скрипта. Через каждый 100 продуктов стоит COMMIT

3) Какая часть скрипта берёт сколько время ?
Не подскажете как проверить?

4) Содержимое touchProduct и touchValue ?
В прикрепленном файле

5) EXPLAIN и PROFILING запросов.
Запросы в функциях - селекты по ключам и инсерты.
Если нужны EXPLAIN и PROFILING каких-то запросов - скажите, я приведу их


6) my.snf и конфигурации серверов ...
В аттаче

Ubuntu:
Linux 72-Ubuntu SMP Fri Jul 29 21:08:37 UTC 2011 i686 GNU/Linux
mysql  Ver 14.14 Distrib 5.1.41, for debian-linux-gnu (i486) using readline 6.1
model name      : Intel(R) Core(TM)2 Duo CPU     T5750  @ 2.00GHz
MemTotal:        2060052 kB

windows
MS Windows Server 2008 R2 Web Server 64-bit SP1
CPU
Cores    4, Intel(R) Xeon(R) CPU E5504 @ 2.00GHz
Memory
Type    DDR3,24568 MBytes

Отредактированно YAAP (20.09.2011 22:50:52)


Прикрепленные файлы:
Attachment Icon sql.zip, Размер: 7,858 байт, Скачано: 828

Неактивен

 

#4 22.09.2011 17:51:30

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

Re: Медленная работа скрипта для импорта

innodb_flush_log_at_trx_commit=1
Вот это в ноль попробуйте поставить.

Или в виндоус что-то системно-плохое, или данные разные (например,
под ubuntu таблицы не InnoDB) — на 8 мегабайтах по умолчанию InnoDB
тормозит не просто сильно, а дико.

Неактивен

 

#5 26.09.2011 12:04:53

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Re: Медленная работа скрипта для импорта

paulus написал:

innodb_flush_log_at_trx_commit=1
Вот это в ноль попробуйте поставить.

Или в виндоус что-то системно-плохое, или данные разные (например,
под ubuntu таблицы не InnoDB) — на 8 мегабайтах по умолчанию InnoDB
тормозит не просто сильно, а дико.

innodb_flush_log_at_trx_commit поставлю, отпишусь
Под убунтой таблицы InnoDB (только что проверил). Та и я перед тестами делал полный дамп структуры ..
Как видите - не сильно дико тормозит wink

Неактивен

 

#6 26.09.2011 14:27:05

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Re: Медленная работа скрипта для импорта

Не помогло, тестировал на "аналогичном" скрипте (заливались списки возможных параметров) - в убунте 4 секунды, в винде 4 минуты+
При этом в винде mysqld забирал стабильно 13% CPU + 350K памяти.

Неактивен

 

#7 26.09.2011 14:49:08

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

Re: Медленная работа скрипта для импорта

Хм, а Вы уверены, что подхватывается именно этот файл настроек в Windows?
У Вас там написано почти 600 мегабайт памяти, а никак не 350к.

Неактивен

 

#8 26.09.2011 15:45:21

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Re: Медленная работа скрипта для импорта

C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqld" --defaults-file="C:\Program Files\MySQL\MySQL Server 5.5\my.ini" MySQL55

тут сложно ошибиться.
зы: запускал импорт с параметрами -f и --unbeffered

+ написал, что это немного другой файл (он меньше по объему, тестировать легче), но принцип его работы точно такой же, процедура и постоянное обращение к ней.

зыы: аттачу на всякий и этот скрипт


Прикрепленные файлы:
Attachment Icon 1-parameter.sql, Размер: 800,652 байт, Скачано: 1,120

Неактивен

 

#9 27.09.2011 15:58:01

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

Re: Медленная работа скрипта для импорта

И то правда. А подсоединяетесь точно к этому экземпляру? smile

Неактивен

 

#10 27.09.2011 20:49:44

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Re: Медленная работа скрипта для импорта

>where mysql
C:\Program Files\MySQL\MySQL Server 5.5\bin\mysql.exe


Тут тоже мне не очевидно как могу к другому экземпляру обращаться.

та и в самой mysql

mysql> show variables like '%innodb_buffer%';
+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| innodb_buffer_pool_instances | 1         |
| innodb_buffer_pool_size      | 602931200 |
+------------------------------+-----------+
2 rows in set (0.00 sec)
 

Отредактированно YAAP (27.09.2011 20:54:39)

Неактивен

 

#11 28.09.2011 21:51:49

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

Re: Медленная работа скрипта для импорта

Хорошо, а SHOW STATUS LIKE 'innodb_buffer%'? Вдруг у Вас несколько
экземпляров. Штука выглядит действительно очень странно, тут какая-
то ошибка, но надо понять — где.

И, боюсь, что дальше прийдется смотреть вывод SHOW ENGINE INNODB
STATUS во время заливки и пытаться понять, что происходит.

Неактивен

 

#12 28.09.2011 23:29:51

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Re: Медленная работа скрипта для импорта

Ubuntu:

mysql> SHOW STATUS LIKE 'innodb_buffer%';
+-----------------------------------+-------+
| Variable_name                     | Value |
+-----------------------------------+-------+
| Innodb_buffer_pool_pages_data     | 509   |
| Innodb_buffer_pool_pages_dirty    | 0     |
| Innodb_buffer_pool_pages_flushed  | 0     |
| Innodb_buffer_pool_pages_free     | 0     |
| Innodb_buffer_pool_pages_misc     | 3     |
| Innodb_buffer_pool_pages_total    | 512   |
| Innodb_buffer_pool_read_ahead_rnd | 69    |
| Innodb_buffer_pool_read_ahead_seq | 4     |
| Innodb_buffer_pool_read_requests  | 87993 |
| Innodb_buffer_pool_reads          | 2744  |
| Innodb_buffer_pool_wait_free      | 0     |
| Innodb_buffer_pool_write_requests | 0     |
+-----------------------------------+-------+
12 rows in set (0.03 sec)


Windows
mysql> SHOW STATUS LIKE 'innodb_buffer%';
+---------------------------------------+-----------+
| Variable_name                         | Value     |
+---------------------------------------+-----------+
| Innodb_buffer_pool_pages_data         | 7615      |
| Innodb_buffer_pool_pages_dirty        | 0         |
| Innodb_buffer_pool_pages_flushed      | 25786     |
| Innodb_buffer_pool_pages_free         | 28105     |
| Innodb_buffer_pool_pages_misc         | 1080      |
| Innodb_buffer_pool_pages_total        | 36800     |
| Innodb_buffer_pool_read_ahead         | 679       |
| Innodb_buffer_pool_read_ahead_evicted | 0         |
| Innodb_buffer_pool_read_requests      | 173391207 |
| Innodb_buffer_pool_reads              | 5828      |
| Innodb_buffer_pool_wait_free          | 0         |
| Innodb_buffer_pool_write_requests     | 515711    |
+---------------------------------------+-----------+
12 rows in set (0.00 sec)



Забыл добавить, не знаю насколько это важно. Разница между 2-мя машинами еще в том, что убунта - моя локальная система, а винда - сервер, на котором крутится еще несколько сайтов.

Отредактированно YAAP (28.09.2011 23:31:00)

Неактивен

 

#13 29.09.2011 11:55:09

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

Re: Медленная работа скрипта для импорта

Тогда я не верю в 350К памяти.

7615 занятых страниц × 16К памяти на страницу = 122М памяти.
Ищите, где Вы ее потеряли smile

Ну и SHOW ENGINE INNODB STATUS таки надо будет смотреть.

Неактивен

 

#14 29.09.2011 12:37:54

YAAP
Завсегдатай
Зарегистрирован: 17.02.2010
Сообщений: 31

Re: Медленная работа скрипта для импорта

350k памяти брал mysqld  во время загрузки скрипта, т.е. это не данные из mysql,  а всего лишь указания менеджера процессов.
SHOW ENGINE INNODB STATUS, спасибо, буду смотреть.

Неактивен

 

#15 30.09.2011 11:57:32

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

Re: Медленная работа скрипта для импорта

Вряд ли процесс выделил 100 мегабайт, а диспетчер процессов видит 300 килобайт.
Или процесс другой, или смотрите не в тот столбец.

Неактивен

 

Board footer

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