/ / MySQL: оптимизиране на заявката за изчисляване на точкуване - mysql, оптимизация

MySQL: оптимизиране на заявката за изчисляване на точкуване - mysql, оптимизация

Имам таблица с данни, която използвам, за да направя някои изчисления. Полученият набор от данни след изчисленията изглежда така:

+------------+-----------+------+----------+
| id_process | id_region | type | result   |
+------------+-----------+------+----------+
|          1 |         4 |    1 |  65.2174 |
|          1 |         5 |    1 |  78.7419 |
|          1 |         6 |    1 |  95.2308 |
|          1 |         4 |    1 |  25.0000 |
|          1 |         7 |    1 | 100.0000 |
+------------+-----------+------+----------+

От друга страна имам друга таблица, която съдържа набор от диапазони, които се използват за класифициране на резултатите от изчисленията. Таблиците с диапазони изглеждат така:

 +----------+--------------+---------+
| id_level | start |  end |  status |
+----------+--------------+---------+
|        1 |   0   |   75 |  Danger |
|        2 |  76   |   90 |  Alert  |
|        3 |  91   |  100 |  Good   |
+----------+--------------+---------+

Трябва да направя заявка, която да добавя съответната колона "състояние" към всяка стойност, когато се правят изчисления. В момента мога да направя това, за да добавя следното поле към заявката за изчисление:

select
...,
...,
[math formula] as result,
(select status
from ranges r
where result between r.start and r.end) status
from ...
where ...

Тя работи добре. Но когато имам много редове (повече от 200K), заявката за изчисление става бавна.

Моят въпрос е: има някакъв начин да се намери, че "статут" стойност, без да направи този подзапитване?

Някой е работил по нещо подобно преди?

Благодаря

Отговори:

2 за отговор № 1

Да, търсите подзаявка и се присъединете:

select s.*, r.status
from (select s.*
from <your query here>
) s left outer join
ranges r
on s.result between r.start and r.end

изричен joinчесто се оптимизират по-добре от вложените select, В този случай обаче ranges таблицата изглежда доста малка, така че това може да не е проблем с производителността.