Производительность запросов Mysql пересечения

Я совершенно новичок в MySQL. У меня есть 2 идентичные таблицы MySQL, которые имеют 50K строк (70 столбцов) каждая. Эти таблицы обновляются каждый день путем подачи данных. Мне нужно выполнить несколько вложенных запросов, таких как пересечения / вычеты и т. Д.

Один из запросов, которые я пытаюсь использовать, как показано ниже. Но это не работает должным образом. Либо это занимает 5 минут. до 10 мин. (через терминал) или он не отвечает обратно.

SELECT * 
FROM   table1 
WHERE  table1.sku IN (SELECT t1.sku 
                      FROM   ((SELECT DISTINCT sku 
                               FROM   table2) 
                              UNION ALL 
                              (SELECT DISTINCT sku 
                               FROM   table1)) AS t1 
                      GROUP  BY sku 
                      HAVING Count(*) >= 2) 

Как я могу заставить его работать быстрее / правильно? Как я должен настроить таблицы / столбцы (индекс, первичный ключ и т. Д.) Или мне нужно выполнить какие-либо настройки на сервере MySQL?

Я попробовал несколько вещей. Я создал индексы для sku, которые представляют собой столбцы varchar(75). Мой сервер баз данных работает на сервере 1 CoreProcessor (Digital Ocean) с 512 МБ памяти.

--- запрос с 'EXPLAIN'

+----+--------------------+-----------------------+-------+---------------+---------+---------+------+-------+---------------------------------+
| id | select_type        | table                 | type  | possible_keys | key     | key_len | ref  | rows  | Extra                           |
+----+--------------------+-----------------------+-------+---------------+---------+---------+------+-------+---------------------------------+
|  1 | PRIMARY            | table1                | ALL   | NULL          | NULL    | NULL    | NULL | 30260 | Using where                     |
|  2 | DEPENDENT SUBQUERY | <derived3>            | ALL   | NULL          | NULL    | NULL    | NULL | 65677 | Using temporary; Using filesort |
|  3 | DERIVED            | table2                | range | NULL          | sku_idx | 227     | NULL | 31016 | Using index for group-by        |
|  4 | UNION              | table1                | range | NULL          | sku     | 227     | NULL | 30261 | Using index for group-by        |
| NULL | UNION RESULT     | <union3,4>            | ALL   | NULL          | NULL    | NULL    | NULL |  NULL |                                 |
+----+--------------------+-----------------------+-------+---------------+---------+---------+------+-------+---------------------------------+

1 ответ

Решение

Если я правильно понимаю этот конкретный запрос, вы пытаетесь отобразить все записи из таблицы1, которые имеют соответствующий sku в таблице2.

Это может быть достигнуто гораздо более простым запросом:

SELECT * 
FROM   table1 
WHERE  table1.sku IN (SELECT DISTINCT table2.sku FROM table2 )
GROUP BY table1.sku

Или с присоединениями:

SELECT table1.* 
FROM   table1 
INNER JOIN table2 ON table1.sku = table2.sku
GROUP BY table1.sku

Это должно работать мгновенно, если у вас есть индексы на table1.sku а также table2.sku

Другие вопросы по тегам