![]()  | 
		
Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток!
Запрос имеет вид - 
select 
c.servicecall, 
c.id, 
d.WOG_NAME, 
d.DEPAR_NAME, 
c.created, 
c.status, 
c.`assigner`, 
c.actual_start, 
c.timestampAdd, 
c.regl 
from
(select a.servicecall, a.id, a.created, a.status, a.`assigner`, a.workgroup_oid, a.actual_start, a.timestampAdd, (UNIX_TIMESTAMP(now()) - UNIX_TIMESTAMP(a.timestampAdd)) as regl 
from
(select t.servicecall, t.id, t.created, t.`status`, t.workgroup_oid, t.actual_start, t.`assigner`, t.timestampAdd from bo.ordersBO t
where t.timestampAdd >= DATE_SUB(CURRENT_DATE, INTERVAL 4 DAY) AND t.`status` IN ('Новый', 'В работе')) a
LEFT JOIN
(select t.servicecall, t.`status` from bo.ordersBO t
where t.timestampAdd >= DATE_SUB(CURRENT_DATE, INTERVAL 4 DAY) AND t.`status` = 'Закрыто') b
on a.servicecall = b.servicecall where b.`status` is null) c
JOIN
bo.spr_orders_binding d
on c.workgroup_oid = d.NAME_ID WHERE c.regl >=86400 order by c.`servicecall`
Всё работает, но сам запрос выполняется более 300!!! сек.! Индексы построены по полям servicecall, id, workgroup_oid, timestampAdd, status... Подскажите - как можно ускорить выборку?
Заранее спасибо за помощь!
Неактивен

покажите план запроса и структуру таблиц
Неактивен
Поскольку не на работе сейчас, то вкратце план такой - отбор всех записей, которые подпадают под условие В РАБОТЕ, НОВЫЙ, в интервале времени от текущей даты минус 4 суток. Отбрасываем, через JOIN, те записи, которые со статусом ЗАКРЫТО. Далее высчитываю разницу между текущей датой и датой начала статуса В РАБОТЕ или НОВЫЙ и после этого сравниваю со справочником и вывожу только те записи, которые принадлежат моему отделу. Таблиц две - первая ordersBO боевая, а spr_orders_binding - это справочник (124 строки)
Как-то так...
Неактивен

навскидку у вас лишний from подзапрос.
Неактивен
Здравствуйте! Частично помогло то, что Вы посоветовали... Я пробовал скомбинировать по разному, но время выборки лишь удалось уменьшить до 150 сек., меньше никак... Понятно, что при увеличении интервала дней (INTERVAL 4 DAY) и время итогового вывода увеличивается... В принципе - такое всё-же устраивает, потому что это уже не 300 сек. ![]()
Спасибо за помощь!!!
Неактивен

150 секунд это тоже много.
Сколько у вас всего записей за 4 дня, сколько отбираются подзапросами? Ну и план (explain select ..) со структурой таблиц (show create ..) покажите.
Неактивен
id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
1    PRIMARY    <derived2>    ALL                    1117    Using where; Using filesort
1    PRIMARY    d    ref    NAME_ID    NAME_ID    9    c.workgroup_oid    1    Using where
2    DERIVED    <derived3>    ALL                    13466    
2    DERIVED    <derived4>    ALL                    5907    Using where
4    DERIVED    t    ref    timestampAdd,status    status    63        39468    Using where
3    DERIVED    t    range    timestampAdd,status    timestampAdd    9        20281    Using where
**********************************************************************************************
Table    Create Table
ordersBO    CREATE TABLE `ordersBO` (
  `servicecall` bigint(15) DEFAULT NULL,    
  `sc_classification` bigint(20) DEFAULT NULL,    
  `parent_id` bigint(15) DEFAULT NULL,    
  `id` bigint(15) DEFAULT NULL,    
  `oid` bigint(20) DEFAULT NULL,    
  `classification` bigint(20) DEFAULT NULL,    
  `complexity` bigint(5) DEFAULT NULL,    
  `description` varchar(250) DEFAULT NULL,    
  `created` varchar(20) DEFAULT NULL,    
  `requestor` varchar(20) DEFAULT NULL,    
  `info` text,    
  `status` varchar(20) DEFAULT NULL,    
  `workgroup` varchar(250) DEFAULT NULL,    
  `workgroup_oid` bigint(20) DEFAULT NULL,    
  `assigner` varchar(20) DEFAULT NULL,    
  `actual_start` varchar(20) DEFAULT NULL,    
  `solution` text,    
  `remark` text,    
  `actual_finish` varchar(20) DEFAULT NULL,    
  `closecode` varchar(20) DEFAULT NULL,    
  `score` bigint(5) DEFAULT NULL,    
  `timestamp` bigint(20) DEFAULT NULL,    
  `dateAdd` date NOT NULL,    
  `timestampAdd` datetime DEFAULT NULL,    
  KEY `workgroup_oid` (`workgroup_oid`),    
  KEY `timestampAdd` (`timestampAdd`),    
  KEY `id` (`id`),    
  KEY `status` (`status`),    
  KEY `servicecall` (`servicecall`),    
  KEY `closecode` (`closecode`)    
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Данные по ордерам HelpDesk'
Неактивен

А если так?
Неактивен
Ув. Архат (vasya), ерунда какая-то, но выигрыша в скорости не больше 10% 
 Я в шоке... Единственное подозрение - сервер! Он в самом деле чрезвычайно медленный, сделан на Atom... Обычные select работают так-сяк, а вот когда дело касается двух-трёх JOIN, а если при этом происходит ещё какой-то insert OR update, вообще всё ложится... Так что наверное дело не в выборке... ИМХО!
Неактивен

Число транзисторов в процессоре Atom сокращено за счет блока для вычислений с плавающей точкой. Однако, целочисленные операции он выполняет достаточно быстро, поэтому трудно сказать дело в нем или нет.
Неактивен