mysql: нужно сократить запрос

У меня есть запрос, который дает правильный результат, но у него есть внутренние запросы, повторяющиеся те же условия. Я попытался максимально сократить длину запроса с моей стороны.

Может ли кто-нибудь помочь мне уменьшить сложность запроса, так как получение результата на сервере занимает 12 минут, что может вызвать много проблем в будущем.

Проблема в том, что одни и те же условия повторяются, и запрос использует в нем внутренний запрос.

Запрос с использованием этих параметров mysql: -

sum,if,GROUP_CONCAT в нем.

запрос:-

select 
sum( 
IF(priority="P1",1,0)) P1,
sum( 
IF((timediff(delta_ts,creation_ts) > "00:02:00") 
 && (priority="P1") ,1,0))P1_exeeded,
 (select 
 GROUP_CONCAT( DISTINCT bug_id) 
 from bugs 
 where  
 ( 
   IF((timediff(delta_ts,creation_ts) > "00:02:00") && (priority="P1") 
   && (product_id=237)
   &&(bugs.resolution='FIXED')
   &&(bug_status="RESOLVED")
   &&(bugs.creation_ts >='2013-06-14 09:00:00' 
   && bugs.creation_ts <= '2013-06-16 08:59:59') ,1,0)
 )
) as bug_ids,

SUM(
IF(priority="P2",1,0)) P2,
sum( 
IF((timediff(delta_ts,creation_ts) > "00:01:00") 
&& (priority="P2") ,1,0))P2_exeeded,
(select GROUP_CONCAT( DISTINCT bug_id) 
 from bugs 
 where
 ( 
 IF((timediff(delta_ts,creation_ts) > "00:02:00") 
 && (priority="P2") 
 && (product_id=237)&&(bugs.resolution='FIXED')
 &&(bug_status="RESOLVED")&&(bugs.creation_ts >='2013-06-14 09:00:00' 
 && bugs.creation_ts <= '2013-06-16 08:59:59') ,1,0)
 )
 ) as bug_ids,
 SUM(
 IF(priority="P3",1,0)) P3count,
 SUM(
 IF(priority="P4",1,0)) P4count 
 from bugs 
 where bugs.product_id=237 
 and bugs.resolution='FIXED' 
 and bugs.creation_ts >='2013-06-14 09:00:00' 
 and bugs.creation_ts <= '2013-06-16 08:59:59' 
 and bug_status="RESOLVED";

Результат:-

+------+------------+---------+------+------------+---------+---------+---------+
| P1   | P1_exeeded | bug_ids | P2   | P2_exeeded | bug_ids | P3count | P4count |
+------+------------+---------+------+------------+---------+---------+---------+
|    7 |          1 | 3743304 |    6 |          1 | 3743305 |       5 |       1 |
+------+------------+---------+------+------------+---------+---------+---------+
  • Для получения идентификаторов ошибок я использовал группу concat. Возникает сложность запроса

person Monisha    schedule 16.06.2013    source источник
comment
Индекс также является вашим другом, если вы обнаружите, что используете много столбцов в своих условиях, создайте индекс, и вы увидите, как происходит волшебство;)   -  person Timmetje    schedule 16.06.2013
comment
Согласен с timmied, вы должны правильно проиндексировать таблицы.   -  person M Khalid Junaid    schedule 16.06.2013
comment
кто-нибудь может привести простой пример?   -  person Monisha    schedule 16.06.2013
comment
как сказано, добавьте индекс, охватывающий все поля, используемые в операторе where или order by. ваш индекс может варьироваться в зависимости от вашего ядра базы данных, но в целом это должно повысить производительность. просто имейте в виду, что индексы увеличивают размер вашей базы данных, особенно большие базы данных могут стать НАМНОГО больше, если вы добавите много индексов!   -  person Steffen Nieuwenhoven    schedule 16.06.2013


Ответы (1)


Получил ответ:-

Решил это так: -

select 
sum(
IF(
priority="P1",1,0)) P1, 
sum(
IF(
(timediff(delta_ts,creation_ts) > "00:02:00") && (priority="P1") ,1,0)) P1_exeeded,
REPLACE(GROUP_CONCAT(
IF(
(timediff(delta_ts,creation_ts) > "00:02:00") 
  && (priority="P1") ,bug_id,'')),',,','' ) as bugids,  
SUM(
IF(priority="P2",1,0)) P2, 
sum( IF((timediff(delta_ts,creation_ts) > "00:01:00") 
 && (priority="P2") ,1,0))P2_exeeded,
REPLACE(GROUP_CONCAT(IF((timediff(delta_ts,creation_ts) > "00:02:00") 
 && (priority="P2") ,bug_id,'')),',,','' ) as bugids ,
SUM(
IF(priority="P3",1,0)) P3count, 
sum( 
IF(
(timediff(delta_ts,creation_ts) > "00:02:00") 
&& (priority="P3"),1,0))P3_exeeded,
REPLACE(GROUP_CONCAT(
IF((timediff(delta_ts,creation_ts) > "00:02:00") 
 && (priority="P3") ,bug_id,'')),',,','' ) asbugids, 
SUM(
 IF(priority="P4",1,0)) P4count,
sum(
 IF(
(timediff(delta_ts,creation_ts) > "00:02:00") 
 && (priority="P4") ,1,0)) P4_exeeded,
 REPLACE(
 GROUP_CONCAT(
  IF(
  (timediff(delta_ts,creation_ts) > "00:02:00") 
  && (priority="P4") ,bug_id,'')),',,','' ) as bugids 
  from bugs 
  where bugs.product_id=237 
  and bugs.resolution  ='FIXED' 
  and bugs.creation_ts >='2013-06-14 09:00:00' 
  and bugs.creation_ts <= '2013-06-16 08:59:59' 
  and bug_status="RESOLVED";

И я получил результат в течение 0,01 сек.

+------+------------+-----------+------+------------+---------+---------+------------+--------+---------+------------+--------+
| P1   | P1_exeeded | bugids    | P2   | P2_exeeded | bugids  | P3count | P3_exeeded | bugids | P4count | P4_exeeded | bugids |
+------+------------+-----------+------+------------+---------+---------+------------+--------+---------+------------+--------+
|    7 |          1 | ,3743304, |    6 |          1 | 3743305 |       5 |          0 |        |       1 |          0 |        |
+------+------------+-----------+------+------------+---------+---------+------------+--------+---------+------------+--------+

Спасибо, ребята, я использовал замену вместо внутреннего запроса и использовал группу con cat без внутреннего запроса.

person Monisha    schedule 16.06.2013