Я пытаюсь проверить, находится ли значение в TABLE_1 в диапазоне, основанном на 2 столбцах в TABLE_2. Я могу выполнить на основе ответа, предоставленного в вопросе SQL: Проверка, если число в диапазоне нескольких диапазонов , однако, когда я использовал этот метод с большим набором данных (~ 40K строк в обеих таблицах), это максимизирует ЦП на моем сервере SQL и запрос занимает более 3 минут. Есть ли способ оптимизировать этот запрос и ограничить использование процессора этим запросом? Если нет, есть ли альтернативный запрос, который может быть более эффективным.
TABLE_1:
mysql> SELECT * FROM TABLE_1;
+----+---------+-------+
| ID | FRUIT | COUNT |
+----+---------+-------+
| 1 | Apples | 2314 |
| 2 | Oranges | 3412 |
| 3 | Oranges | 1296 |
| 4 | Apples | 2230 |
| 5 | Apples | 5293 |
| 6 | Oranges | 1994 |
+----+---------+-------+
6 rows in set (0.00 sec)
TABLE_2:
mysql> SELECT * FROM TABLE_2;
+----+---------+-------------+-----------+
| ID | FRUIT | START_RANGE | END_RANGE |
+----+---------+-------------+-----------+
| 1 | Apples | 2300 | 2400 |
| 2 | Apples | 7000 | 8000 |
| 3 | Oranges | 1296 | 1296 |
| 4 | Apples | 5000 | 6000 |
| 5 | Oranges | 9000 | 9999 |
| 6 | Oranges | 8000 | 9000 |
+----+---------+-------------+-----------+
Запрос:
SELECT *
FROM TABLE_1
WHERE NOT EXISTS (SELECT 1 FROM TABLE_2
WHERE TABLE_1.FRUIT = TABLE_2.FRUIT
AND TABLE_1.COUNT BETWEEN TABLE_2.START_RANGE AND TABLE_2.END_RANGE);
Выход:
+----+---------+-------+
| ID | FRUIT | COUNT |
+----+---------+-------+
| 2 | Oranges | 3412 |
| 4 | Apples | 2230 |
| 6 | Oranges | 1994 |
+----+---------+-------+
3 rows in set (0.00 sec)