powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему не видит индекс. Ну и вообще как ускорить запрос... :)
21 сообщений из 21, страница 1 из 1
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39532958
TimofeySin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос:
Код: sql
1.
2.
3.
select * 
from cdr 
WHERE cdr.calldate > '2017-10-06' and cdr.dst like '0747' AND cdr.dstchannel = 'SIP/0747-00001746'


EXPLAIN:

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEcdrrangecalldate dst dstchanneldst242NULL9878Using where

Почему оно не использует
Код: sql
1.
INDEX `dstchannel` (`calldate`, `dst`, `dstchannel`)

?
И как сделать запрос более быстрым? Результат 1 строка.



Таблица:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
CREATE TABLE `cdr` (
	`calldate` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
	`clid` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`src` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`dst` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`dcontext` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`channel` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`dstchannel` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`lastapp` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`lastdata` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`duration` INT(11) NOT NULL DEFAULT '0',
	`billsec` INT(11) NOT NULL DEFAULT '0',
	`disposition` VARCHAR(45) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`amaflags` INT(11) NOT NULL DEFAULT '0',
	`accountcode` VARCHAR(20) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`uniqueid` VARCHAR(32) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`userfield` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`did` VARCHAR(50) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`recordingfile` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`cnum` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`cnam` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`outbound_cnum` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`outbound_cnam` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`dst_cnam` VARCHAR(80) NOT NULL DEFAULT '' COLLATE 'utf8_unicode_ci',
	`call_id` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	`call_route` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	`filename` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	`caller` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	`called` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	`start` DATETIME NULL DEFAULT '0000-00-00 00:00:00',
	`answer` DATETIME NULL DEFAULT '0000-00-00 00:00:00',
	`end` DATETIME NULL DEFAULT '0000-00-00 00:00:00',
	`linkedid` VARCHAR(32) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	`sequence` INT(11) NULL DEFAULT NULL,
	`qeholdtime` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	`qeorigpos` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
	INDEX `calldate` (`calldate`),
	INDEX `dst` (`dst`),
	INDEX `accountcode` (`accountcode`),
	INDEX `uniqueid` (`uniqueid`),
	INDEX `did` (`did`),
	INDEX `dstchannel` (`calldate`, `dst`, `dstchannel`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
;

...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39532963
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. какая скорость сейчас? измерьте 3 раза используя SQL_NO_CACHE
Типа:

select SQL_NO_CACHE *
from cdr
WHERE cdr.calldate > '2017-10-06'....................

2. какую скорость вы хотите?

3. Ехплаин говорит что DIS индекс используется.
Т.е. ситуация не "невидит индекс" а "невидит индекс
который я (почему-то) хочу чтоб mysql использовал"

4. cdr.dst like '0747' можно заменить на cdr.dst = '0747'

5. чтоб разобратся с индексами, надо
"профилировать" данные, кардиналити, разброс,
конкретные выборки...
Для начала выдайте результат такого запроса:

select count(1) cnt1,
count( cdr.calldate > '2017-10-06') cnt2,
count(cdr.dst = '0747') cnt3,
count(cdr.dstchannel = 'SIP/0747-00001746') cnt4,
from cdr ;
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39532968
TimofeySin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. 0,7 секунды.
2. хочу 0,2 хотя бы
3. Ну да но я ж индекс прям по всем полям поиска ему дал, что не так то...
4. Да там и был =, не то написал из-за разных проб запросов, оно не влияет на результат
5. cnt1cnt2cnt3cnt43858473385847338584733858473

Ну в самом деле у меня проблема вот какая, а это я как упрощенный вариант показал :)


Запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
SELECT
RIGHT(`queue_log`.`agent`,4) AS `Агент`
,`queue_log`.`data1` AS `ВходВГруппу`
,`queue_log`.`time` AS `ВыходИзГруппы`
, TIME_TO_SEC(TIMEDIFF(`queue_log`.`time`, IF((`queue_log`.`data1` = ''),`queue_log`.`time`,`queue_log`.`data1`))) AS `ВремяВГруппе`
,`cdr`.`uniqueid` AS `ИДРазговора`
,`cdr`.`src` AS `Абонент`
, IFNULL(`cdr`.`calldate`,'0000-00-00') AS `ВремяНачала`
,`cdr`.`end` AS `времяОкончания`
,`cdr`.`billsec` AS `ВремяРазговора`
, SUBSTR(`cdr`.`dstchannel`
,(LOCATE('/',`cdr`.`dstchannel`) + 1),4) AS `АгентCDR`
,`cdr`.`disposition` AS `Статус`
FROM (`queue_log` LEFT JOIN `cdr` ON (((SUBSTR(`cdr`.`dstchannel`,5,4) = RIGHT(`queue_log`.`agent`,4)) 
AND (IFNULL(`cdr`.`calldate`,'0000-00-00') >= `queue_log`.`data1`) AND (IFNULL(`cdr`.`calldate`,'0000-00-00') <= `queue_log`.`time`) 
AND (`cdr`.`dst` LIKE '07%') AND (`cdr`.`calldate` > '2017-10-06'))))
WHERE ((`queue_log`.`queuename` = 'Programmist_queue') AND (`queue_log`.`event` = 'REMOVEMEMBER') AND (`queue_log`.`data1` <> '') AND (`queue_log`.`time` > '2017-10-06')) 

UNION

SELECT
RIGHT(`queue_log`.`agent`,4) AS `Агент`
,`queue_log`.`data1` AS `ВходВГруппу`
,`queue_log`.`time` AS `ВыходИзГруппы`
, TIME_TO_SEC(TIMEDIFF(`queue_log`.`time`, IF((`queue_log`.`data1` = ''),`queue_log`.`time`,`queue_log`.`data1`))) AS `ВремяВГруппе`
,`cdr`.`uniqueid` AS `ИДРазговора`
,`cdr`.`src` AS `Абонент`
, IFNULL(`cdr`.`calldate`,'0000-00-00') AS `ВремяНачала`
,`cdr`.`end` AS `времяОкончания`
,`cdr`.`billsec` AS `ВремяРазговора`
, SUBSTR(`cdr`.`dstchannel`
,(LOCATE('/',`cdr`.`dstchannel`) + 1),4) AS `АгентCDR`
,`cdr`.`disposition` AS `Статус`
FROM (`cdr` LEFT JOIN `queue_log` ON (((SUBSTR(`cdr`.`dstchannel`,5,4) = RIGHT(`queue_log`.`agent`,4)) 
AND (IFNULL(`cdr`.`calldate`,'0000-00-00') >= `queue_log`.`data1`) AND (IFNULL(`cdr`.`calldate`,'0000-00-00') <= `queue_log`.`time`) 
AND (`queue_log`.`queuename` = 'Programmist_queue') AND (`queue_log`.`event` = 'REMOVEMEMBER') AND (`queue_log`.`data1` <> '') AND (`queue_log`.`time` > '2017-10-06'))))
WHERE ((`cdr`.`dst` LIKE '07%') AND (`cdr`.`calldate` > '2017-10-06') AND (`cdr`.`dstchannel` <> ''))




EXPLAIN
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1PRIMARYqueue_logrefEvent Time Data1Event97const200Using where1PRIMARYcdrrangecalldate dst dstchanneldst242NULL30976Using where2UNIONcdrrangecalldate dst dstchanneldst242NULL30976Using where2UNIONqueue_logrefEven Time Data1Event97const200NULLUNION RESULT<union1 2>ALLNULLNULLNULLNULLNULL


Таблица queue_log не большая и тормознутости не дает, а вот CDR 2гига уже.
И вот этот большой запрос выполняется под 54 секунды....
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533011
TimofeySin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по поводу кардиналити:
TABLE_CATALOGTABLE_SCHEMATABLE_NAMENON_UNIQUEINDEX_SCHEMAINDEX_NAMESEQ_IN_INDEXCOLUMN_NAMECOLLATIONCARDINALITYSUB_PARTPACKEDNULLABLEINDEX_TYPECOMMENTNULLasteriskcdrdbcdr1asteriskcdrdbcalldate1calldateA3821260NULLNULLBTREENULLasteriskcdrdbcdr1asteriskcdrdbdst1dstA127375NULLNULLBTREENULLasteriskcdrdbcdr1asteriskcdrdbaccountcode1accountcodeA17NULLNULLBTREENULLasteriskcdrdbcdr1asteriskcdrdbuniqueid1uniqueidA3821260NULLNULLBTREENULLasteriskcdrdbcdr1asteriskcdrdbdid1didA17NULLNULLBTREENULLasteriskcdrdbcdr1asteriskcdrdbdstchannel1calldateA3821260NULLNULLBTREENULLasteriskcdrdbcdr1asteriskcdrdbdstchannel2dstA3821260NULLNULLBTREENULLasteriskcdrdbcdr1asteriskcdrdbdstchannel3dstchannelA3821260NULLNULLBTREENULLasteriskcdrdbqueue_log1asteriskcdrdbEvent1eventA18NULLNULLYESBTREENULLasteriskcdrdbqueue_log1asteriskcdrdbTime1timeA518934NULLNULLYESBTREENULLasteriskcdrdbqueue_log1asteriskcdrdbData11data1A664NULLNULLYESBTREE
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533034
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimofeySin,

...попробуйте поменять порядок полей в индексе --
если на первом месте поле по которому идет ">" ренже --
ето хуже чем на первом месте поле в БОЛЬШОЙ кардинальностью.
лучше всего -- уникальние поле первым (или даже единственым)...

...трудно анализировать унион -- выдайте подробности (екплейн)
самого медленого из двух юнионов....

....если вы уверены в индексе -- посмотрите как ФОРСИРОВАТЬ индекс --
есть хинты типа USE INDEX, FORCE INDEX....
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533041
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimofeySinПочему оно не использует
Код: sql
1.
INDEX `dstchannel` (`calldate`, `dst`, `dstchannel`)

И не будет. Какая разница - фуллскан таблицы или индекса? Убери из индекса calldate или поставь его последним - тогда будет использоваться.
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533042
TimofeySin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да там если убить второй запрос ничего толком не меняется. Всмысле сам юнион ничего не ест, жрут запросы почти идентичные.

idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra1SIMPLEqueue_logrefEvent Time Data1Event97const200Using where1SIMPLEcdrrangecalldate dst dstchanneldst242NULL30976Using where
про юз индекс не знал, спасибо. Стало понятно почему sql выбрал этот индекс :), остался ток вопрос, как ускорить это всё..
Меня убивает что "rows" в эксплейне 30976, а в реалии выдает 240. Я как понял у меня получается 200*30976 операций сравнения и из-за этого и тормоза такие...
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533043
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimofeySinМеня убивает что "rows" в эксплейне 30976, а в реалии выдает 240.Есть результат, а есть оценка результата без получения самогО результата. Ошибка на два порядка - вполне возможна, особенно если статистика неактуальна.
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533125
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimofeySinДа там если убить второй запрос ничего толком не меняется. Всмысле сам юнион ничего не ест, жрут запросы почти идентичные.

1. из общих соображений , пожалуйста, уточняйте что
к чему относится.

2, конкретно:

>> жрут запросы почти идентичные

два запроса в юнион имеет разную бизнесс логику и разную
логику запроса. Скорее всего и оптимизация (если возможна)
будет разная.

3. селект 1: "LOG left join CDR"
сначало надо оптимизировать филтрацию по ЛОГ.
Что за индекс "Event"?.
Сколько записей дает:

select count(1)
from`queue_log`
WHERE `queue_log`.`queuename` = 'Programmist_queue'
AND (`queue_log`.`event` = 'REMOVEMEMBER')
AND (`queue_log`.`data1` <> '')
AND (`queue_log`.`time` > '2017-10-06'))

4. Селект-1. Что бы помочь оптимизатору, можно переписать селект
указав полную выборку из ЛОГа в явном виде, типа:

SELECT
RIGHT(`queue_log`.`agent`,4) AS `Агент`
,`queue_log`.`data1` AS `ВходВГруппу`
,`queue_log`.`time` AS `ВыходИзГруппы`
, TIME_TO_SEC(TIMEDIFF(`queue_log`.`time`, IF((`queue_log`.`data1` = ''),`queue_log`.`time`,`queue_log`.`data1`))) AS `ВремяВГруппе`
,`cdr`.`uniqueid` AS `ИДРазговора`
,`cdr`.`src` AS `Абонент`
, IFNULL(`cdr`.`calldate`,'0000-00-00') AS `ВремяНачала`
,`cdr`.`end` AS `времяОкончания`
,`cdr`.`billsec` AS `ВремяРазговора`
, SUBSTR(`cdr`.`dstchannel`
,(LOCATE('/',`cdr`.`dstchannel`) + 1),4) AS `АгентCDR`
,`cdr`.`disposition` AS `Статус`
FROM
(
select *
from`queue_log`
WHERE `queue_log`.`queuename` = 'Programmist_queue'
AND (`queue_log`.`event` = 'REMOVEMEMBER')
AND (`queue_log`.`data1` <> '')
AND (`queue_log`.`time` > '2017-10-06'))
) LOG2

LEFT JOIN `cdr` ON (((SUBSTR(`cdr`.`dstchannel`,5,4) = RIGHT( LOG2 .`agent`,4))
AND (IFNULL(`cdr`.`calldate`,'0000-00-00') >= LOG2 .`data1`)
AND (IFNULL(`cdr`.`calldate`,'0000-00-00') <= LOG2 .`time`)
AND (`cdr`.`dst` LIKE '07%')
AND (`cdr`.`calldate` > '2017-10-06'))))
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533129
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5. Select-1. разбор связки

LEFT JOIN `cdr` ON (((SUBSTR(`cdr`.`dstchannel`,5,4) = RIGHT(LOG2.`agent`,4))

dstchannel -- полностью выпадает из рассмотрения
для индекса ибо применяется финкция
Возможное улучшение: создание нового поля
CDR.AGENT и заполнить его значением SUBSTR(`cdr`.`dstchannel`,5,4) при инсерте.
И включить (парвильно включить!) CDR.AGENT в индекс

AND (IFNULL(`cdr`.`calldate`,'0000-00-00') >= LOG2.`data1`)
AND (IFNULL(`cdr`.`calldate`,'0000-00-00') <= LOG2.`time`)

ранже >< после IFNULL -- скорее всего индекс не будет рассматроватся
Возможное улучшение: заменить NULL на '0001-01-01' на вставке
и убрать ИФНУЛЛ из запроса
(дабaвка, у вас calldate NOT NULL DEFAULT '000...', зачем IFNULL ????????)

AND (`cdr`.`dst` LIKE '07%')

может быть рассмотрен в индексе, вопрос в селективности 07%
Что дает запрос:
select count(1) from CDR where `dst` LIKE '07%'
если меньше чем 200К -- можно попробовать индекс НАЧИНАЮШИЙСЯ с DST.

AND `cdr`.`calldate` > '2017-10-06'

Что дает запрос:
select count(1) from CDR where `cdr`.`calldate` > '2017-10-06'

у вас запросы всегда за последний день? если нет то
можно ли ограничится запросами за ОДИН день?
Если "да' на любой вопрос выше, то можно добавить
CDR.CallDateDate и хранить DATE,а потом использовать
"=" в поиске.
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533132
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
6. Селект-1. Обратно к ЛОГ -- сейчас посмотрел -- там тоже нехило пол
милиона записей. Т.е. нужно отработать ету часть серьезно.
Индекс EVENT имеет низкую кардинальность 18.
Можно попробовать добать время как ВТОРОЕ поле.
Для експеримента, отдельно, можно попробовать время как ПЕРОВ (и единственое)
поле в индексе.
( https://dev.mysql.com/doc/refman/5.7/en/range-optimization.html)
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533133
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...кстати, без относительно всего -- сделайте
OPTIMIZE TABLES
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533134
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
7. Selekt-2.

опятже, сначала ОТДЕЛЬНО надо рассмотреть запрос по CDR

select *
from CDR
WHERE `cdr`.`dst` LIKE '07%'
AND `cdr`.`calldate` > '2017-10-06'
AND `cdr`.`dstchannel` <> ''

dst и calldate -- рассмотреть тоже самое что и для Селект-1
dstchannel тут не интересно

8. Селект-2 Связка на ЛОГ

LEFT JOIN `queue_log`
ON (((SUBSTR(`cdr`.`dstchannel`,5,4) = RIGHT(`queue_log`.`agent`,4))

Если есть возможность -- добавьте поле , которое заполняйте при вставке
`queue_log`.`agent2` = RIGHT(`queue_log`.`agent`,4)

Может получится (или нет, без гарантий) хороший селективный индех

AND (IFNULL(`cdr`.`calldate`,'0000-00-00') >= `queue_log`.`data1`)
AND (IFNULL(`cdr`.`calldate`,'0000-00-00') <= `queue_log`.`time`)

Убрать IFNULL. Дата1 и Тиме могут быть частью индекса (или одиночным индексом)

AND (`queue_log`.`queuename` = 'Programmist_queue')

select count(1) from log where `queuename` = 'Programmist_queue' ???

AND (`queue_log`.`event` = 'REMOVEMEMBER')

select count(1) from log where `event` = 'REMOVEMEMBER' ???

AND (`queue_log`.`data1` <> '')

AND (`queue_log`.`time` > '2017-10-06'))))

..вообшето уже была такая обрезка в CDR, зачем повторять?
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533135
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...если вовсем скучно будет, то можно будет занятся
другими улучпшениями, типа обрезка старых записей,
вынесение некоторых полей в смежные таблицы...
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533189
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimofeySinЗапрос:

select *
from cdr
WHERE cdr.calldate > '2017-10-06' and cdr.dst like '0747' AND cdr.dstchannel = 'SIP/0747-00001746'


Почему оно не использует
Код: sql
1.
INDEX `dstchannel` (`calldate`, `dst`, `dstchannel`)

?
И как сделать запрос более быстрым? Результат 1 строка.

индекс должен быть для этого запроса

INDEX `dstchannel` ( `dstchannel`, `dst`,`calldate` )


r]
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533346
TimofeySin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,
3) идекс евент: там в 3 посте кардигалити есть по таблицам, у евента 18.

4) переписать с вложенным запросом незя, я хоху вьюху сделать такую, а mysql не разрешает вложенные.

5)

Ifnull во втором запросе и правда можно убрать, а в первым нельзя, он из-за соединения появляется.

По поводу условия '2017-10-06', просто тогда были введены изменения в таблицы и до этой даты данные по другому заполнялись.

Индекс и так применяется только dst.
Log быстро выполняется за счет того
queuename` = 'Programmist_queue'
AND (`queue_log`.`event` = 'REMOVEMEMBER') появилось недавно ( с 6 числа)

Короче понял что надо начинать тригеры писать, чтоб красиво все было в таблице.
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533564
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimofeySinIfnull во втором запросе и правда можно убрать, а в первым нельзя, он из-за соединения появляется.

IFNULL(calldate...) можно и нужно убрать в связке (ON секция) в обоих запросах.
IFNULL нужно оставить в SELECT секции в первом запросе
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533569
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimofeySin3) идекс евент: там в 3 посте кардигалити есть по таблицам, у евента 18.

ок, 18 -- мало на 500К , как уже сказано выше, надо
поекспериментировать с запросом на ЛОГ отдельно.
возможно добавить временые поля в индекс
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533579
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimofeySin4) переписать с вложенным запросом незя, я хоху вьюху сделать такую, а mysql не разрешает вложенные.

во-первых -- Это ограничение обходится -- можно сделать вьюху внутри вьюхи

во-вторых -- я крайне не рекомендую делать вьюхи в даной ситуации. Типа:

select * from view where c = 123

Дело в том что в не самых последних версиях мускл-а
отсутсвует понятие "predicate push" -- тоесть раньше в-юха
вычислялась поностью (долго!) и потом к ней применялось where.

В Оракле уже давно и только совсем недавно MySQL научился
затаскивать условия where внутрь вьюшки с возможностью
использования индексов.

Однако это нестабильно, негарантировано и чем сложнее в-юшка
тем больше вероятность возврата на полный перебор без индексов.
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533587
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimofeySinLog быстро выполняется за счет того
queuename` = 'Programmist_queue'
AND (`queue_log`.`event` = 'REMOVEMEMBER') появилось недавно ( с 6 числа)

Через несколько дней-недель наберется больше таких записей
и наченется тормоз... Не пренебрегайте опимизацией
запросов к ЛОГУ -- в обоих случаях -- и where в первом селекте
и связки (ON) во втором -- причем это могут быть
разнуе индексы.
...
Рейтинг: 0 / 0
Почему не видит индекс. Ну и вообще как ускорить запрос... :)
    #39533590
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TimofeySinКороче понял что надо начинать тригеры писать, чтоб красиво все было в таблице.


да, дополнительные вычисляемые поля (типа Агент2)
будут полезны. Кроме триггеров это можно сделать
на инсерте вычислив значения на клиенте или
SQL функциями прямо в тексте инсерта.
Лично я бы использовал тригеры тут в последнюю очередь...
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему не видит индекс. Ну и вообще как ускорить запрос... :)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]