MySQL Select Union запрос с повторными подзапросами работает медленно - PullRequest
0 голосов
/ 27 октября 2019

У меня есть простая таблица, которая содержит прайс-листы (ID - прайс-листа, КОД товара, ЦЕНА товара), проиндексированные по ID, коду (200 000 записей) - Сначала я сделал это с "LEFT JOIN", ноон работает медленно, затем я делаю это так:

SELECT CODE,price FROM PRICELISTS
WHERE ID=1 AND CODE NOT IN (SELECT CODE FROM PRICELISTS WHERE ID=5)
union 
SELECT CODE,price FROM PRICELISTS WHERE id=5

ЭТО работает быстрее, но недостаточно. Есть ли способ упростить код, чтобы сделать его быстрее?

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Ваш запрос с UNION эквивалентен следующему:

SELECT CODE,price FROM PRICELISTS
WHERE 
  (ID=1 AND CODE NOT IN (SELECT CODE FROM PRICELISTS WHERE ID=5))
  OR
  (id=5)

, который я считаю более эффективным. но если есть дубликаты, которые вы хотите удалить с помощью UNION:

SELECT DISTINCT CODE,price FROM PRICELISTS
WHERE 
  (ID=1 AND CODE NOT IN (SELECT CODE FROM PRICELISTS WHERE ID=5))
  OR
  (id=5)
0 голосов
/ 27 октября 2019

Старайтесь избегать неприменения и используйте левое соединение для несоответствующих значений

    SELECT p.CODE, p.price 
    FROM PRICELISTS p
    LEFT JOIN  (
        SELECT CODE 
        FROM PRICELISTS 
        WHERE ID=5
    ) t1 on t1.code  = p.code 
    where p.id =1 
    and t1.code is null
    union 
    SELECT CODE,price 
    FROM PRICELISTS WHERE id=5

убедитесь, что у вас есть сравнительный индекс в прейскуранте таблиц в столбцах

 id, code, price
...