Есть небольшая табличка примерно 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 - запрос возвращал правильный результат.
Помогите, плиз, понять в чем проблема и куда копать, чтобы не напороться на поведение как в первом запросе.