Как выполнить очень большой запрос MySQL? (прошло несколько дней, потом безуспешно) - PullRequest
0 голосов
/ 24 апреля 2019

Мне нужно выполнить запрос в DATABASE2 (60G), который извлекает данные из DATABASE1 (80G).В некоторых таблицах по 400M строк в обеих базах данных.

INSERT IGNORE INTO product_to_category (
SELECT DISTINCT p.product_id, pds.nodeid
 FROM product p 
JOIN DATABASE2.article_links al ON al.supplierid=p.manufacturer_id
 AND al.datasupplierarticlenumber=p.mpn
 JOIN DATABASE2.passanger_car_pds pds ON al.productid=pds.productid
)

Выполнение заняло более 6 дней !!!затем останавливается, не вставляя ни одной строки в таблицу.

[root@XXXX ~]# mysqladmin pr
+--------+-------------+-------------------+-------------+---------+--------+--------------+------------------------------------------------------------------------------------------------------+
| Id     | User        | Host              | db          | Command | Time   | State        | Info                                                                                                 |
+--------+-------------+-------------------+-------------+---------+--------+--------------+------------------------------------------------------------------------------------------------------+
| 939    | root        | localhost         | mws_autocms | Query   | 408622 | Sending data | INSERT IGNORE INTO product_to_category (
SELECT p.product_id, pds.nodeid
FROM product p
JOIN DATABASE2 |
| 107374 | root        | localhost         |             | Query   | 0      | starting     | show processlist                                                                                     |
+--------+-------------+-------------------+-------------+---------+--------+--------------+------------------------------------------------------------------------------------------------------+

Если я выполню запрос с LIMIT 100 в конце, он выполнит запрос и вставит данные в таблицу.

Я настроил MySQL на:

innodb_flush_method             = O_DIRECT
innodb_log_files_in_group       = 2
innodb_log_file_size            = 1G
innodb_log_buffer_size          = 512M
query_cache_size                = 0
query_cache_type                = 0
innodb_buffer_pool_size         = 12G
innodb_buffer_pool_instances    = 8
innodb_read_io_threads          = 16
innodb_write_io_threads         = 16
innodb_flush_log_at_trx_commit  = 2
innodb_large_prefix             = 1
innodb_file_per_table           = 1
innodb_file_format              = Barracuda
max_allowed_packet              = 1024M
lower_case_table_names          = 1

Безуспешно.

Любая помощь / совет, чтобы выполнить этот запрос, пожалуйста.Я боролся в течение нескольких недель.

Здесь вывод команды EXPLAIN

+----+-------------+---------------------+------------+------+--------------------------------------------------------+---------------------------+---------+-------------------------------------------------+---------+----------+--------------------------+
| id | select_type | table               | partitions | type | possible_keys                                          | key                       | key_len | ref                                             | rows    | filtered | Extra                    |
+----+-------------+---------------------+------------+------+--------------------------------------------------------+---------------------------+---------+-------------------------------------------------+---------+----------+--------------------------+
|  1 | INSERT      | product_to_category | NULL       | ALL  | NULL                                                   | NULL                      | NULL    | NULL                                            |    NULL |     NULL | NULL                     |
|  1 | SIMPLE      | p                   | NULL       | ALL  | manufacturer_id                                        | NULL                      | NULL    | NULL                                            | 5357582 |   100.00 | Using temporary          |
|  1 | SIMPLE      | al                  | NULL       | ref  | PRIMARY,productid,supplierid,datasupplierarticlenumber | datasupplierarticlenumber | 100     | mws_autocms.p.mpn,mws_autocms.p.manufacturer_id |      56 |   100.00 | Using where; Using index |
|  1 | SIMPLE      | pds                 | NULL       | ref  | productid                                              | productid                 | 4       | mws_tecdoc_2018_4_fr.al.productid               |    1322 |   100.00 | Using where; Using index |
+----+-------------+---------------------+------------+------+--------------------------------------------------------+---------------------------+---------+-------------------------------------------------+---------+----------+--------------------------+

Ответы [ 2 ]

0 голосов
/ 24 апреля 2019

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

1) объединить данные из нескольких источников вместе, а затем 2) вставить этот набор результатов в другую базу данных.

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

Создайте таблицу ТОЛЬКО данных, которые вы хотите вставить (один запрос, что-то вроде следующего)

CREATE TABLE dataToImport AS
SELECT DISTINCT p.product_id, pds.nodeid
 FROM product p 
JOIN DATABASE2.article_links al ON al.supplierid=p.manufacturer_id
 AND al.datasupplierarticlenumber=p.mpn
 JOIN DATABASE2.passanger_car_pds pds ON al.productid=pds.productid

Затем импортируйте эти данные:

INSERT IGNORE INTO product_to_category SELECT product_id, nodeid FROM dataToImport

Это немного грубая операция, но это означает, что база данных выполняет меньше работы за один удар, так что вы можете обнаружить, что она решает вашу проблему.

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

0 голосов
/ 24 апреля 2019

Это слишком широкий вопрос, чтобы ответить здесь.Мой ответ здесь - действительно комментарий, но он немного длинный.

«Я боролся в течение нескольких недель» - и это все, что вам нужно показать для этого?

Я настроил MySQL на:

Почему?Как?На каком оборудовании это работает?

Учитывая, что здесь есть несколько опций, требующих перезапуска, означает ли это, что вы имеете эксклюзивное использование экземпляра БД?Если да, то почему используется O_DIRECT?

Зачем объединяться, когда вы используете данные только из одной таблицы?

В некоторых таблицах 400M строк в обеих базах данных.

Вы должны лучше понимать кардинальность или как это передать.

затем остановился, не вставив ни одной строки в таблицу

Почему это прекратилосьбез вставки?Что вы делали для расследования?

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