SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.12.2018 18:19:20

Dmitriy-CoDy
Участник
Зарегистрирован: 11.12.2018
Сообщений: 1

Валидный SELECT запрос возвращает не все данные удовлетворяющие условию

Есть небольшая табличка примерно 2кк записей.
Делаю запрос следующего формата:

SELECT `id`, `asin`, `marketplace_id`
FROM `repricing_product`
WHERE
  (`marketplace_id` = 10 AND `asin` IN ('value',.....)) OR
  (`marketplace_id` =  2 AND `asin` IN ('value',.....)) OR  
  (`marketplace_id` =  3 AND `asin` IN ('value',.....)) OR
  (`marketplace_id` =  1 AND `asin` IN ('value',.....)) OR
  (`marketplace_id` =  7 AND `asin` IN ('value',.....)) OR
  (`marketplace_id` =  8 AND `asin` IN ('value',.....)) OR
  (`marketplace_id` =  5 AND `asin` IN ('value',.....)) OR
  (`marketplace_id` =  4 AND `asin` IN ('value',.....))


где количество значений в операторе IN достаточно велико (например, в условии с `marketplace_id` = 10 их более 9к).
Результирующая выборка не содержит данные, которые соответствуют условию запроса.

Как показал explain, при выполнении запроса используется составной индекс по полям `asin` и `marketplace_id`.
Переписал запрос на такой:

SELECT `id`, `asin`, `marketplace_id`
FROM `repricing_product`
WHERE
  (`asin`, `marketplace_id`) IN
  (
    ('value',10),....,
    ('value',2),....,
    ('value',3),....,
    ('value',1),....,
    ('value',7),....,
    ('value',8),....,
    ('value',5),....,
    ('value',4),....
  )


При выполнении этого запроса возвращаются все данные.

В итоге получается, что есть 2 ВАЛИДНЫХ, ЭКВИВАЛЕНТНЫХ запроса, которые на одинаковых данных возвращают разные результаты.

Из-за "толстого" оператора IN запрос достаточно тяжелый, но он не превышает лимит заданный в конфиге max_allowed_packet. Об ограничениях на количество значений в операторе IN в доках не пишут.
Удалось воспроизвести такое поведение на версиях: 5.6.35-log, 5.6.33-log, 5.6.39-83.1. Тут https://drive.google.com/open?id=11YK9v … gI3kq0dR_0 можно скачать дамп БД (одна таблица) и полные версии запросов с комментариями.

Что делал.

Менял порядок шествия значений в операторах IN - набор отсутствующих строк не менялся.
Если менять местами группы условий, разделенные оператором OR - результаты меняются. На это можно посмотреть если поменять местами (`marketplace_id` = 3 AND `asin` IN ('value',.....)) и (`marketplace_id` = 2 AND `asin` IN ('value',.....)) в примере запроса в файле.
Уменьшал количество значений в операторах IN - запрос возвращал правильный результат.

Помогите, плиз, понять в чем проблема и куда копать, чтобы не напороться на поведение как в первом запросе.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson