Использование MySQL 5.6 У меня возникает большая проблема с производительностью при фильтрации по вычисленной формуле с использованием условий с использованием синтаксиса CASE WHEN THEN ELSE END
.MySQL чрезвычайно медленная фильтрация запросов на CASE WHEN Формула
Эта формула SQL отображается Hibernate. Около 6000 строк в базе данных.
Таблица foo
имеет индексы на столбцах product
и barcode
1. медленных 2-16 сек
select
count(*)
from
foo AS f
where
(
CASE WHEN f.product IS NOT NULL THEN 1
ELSE (
CASE WHEN f.barcode IS NULL THEN 0
ELSE (
SELECT EXISTS(
SELECT 1
FROM product AS p
WHERE p.barcode = f.barcode
LIMIT 1
)
) END
) END
) = 0
EXPLAIN
Результаты:
+----+--------------------+-------+------+-------------------------------+-----+---------+-----+-------+---------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+------+-------------------------------+-----+---------+-----+-------+---------------------------------------------------+
| 1 | PRIMARY | f | ALL | | | | | 700 | Using where |
| 3 | DEPENDENT SUBQUERY | p | ALL | UQ_product,IX_product_barcode | | | | 3134 | Range checked for each record (index map: 0x2008) |
+----+--------------------+-------+------+-------------------------------+-----+---------+-----+-------+---------------------------------------------------+
2. быстро ~ 0,4 s
select
*
from
foo AS f
where
(CASE ... END) = 0
EXPLAIN
результаты идентичны запросу подсчета.
Укажите, что вы удаляете. –