Производительность запросов 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