2016-05-24 3 views
1

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

Один из запросов, которые я пытаюсь использовать, приведен ниже. Но это не работает должным образом. Либо он занимает 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 |         | 
+----+--------------------+-----------------------+-------+---------------+---------+---------+------+-------+---------------------------------+ 

ответ

0

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

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

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

+0

Большое спасибо @Tudor –

Смежные вопросы