Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация запроса / 11 сообщений из 11, страница 1 из 1
15.03.2016, 11:04
    #39192004
udzhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
Доброго времени суток, форумчане!
В последнее время стандартный скрипт для выгрузки пользовательских входов в систему стал очень долго отрабатывать, обычно запрашиваются данные за месяц.
Время отработки в 15 минут выглядит как-то грустно.
Есть у кого-то предложения по оптимизации?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select * from openquery (**БД**, 'select
  pin_eq as "Пин",
  count(*) AS "Количество входов"
from log xc
where xc.user not in (''спец.учетка1'',''спец.учетка1'',''спец.учетка2'',''спец.учетка3'',''спец.учетка4'')
and xc.service_name like ''WSCustomerSearchClients%''
and xc.operation in(''AUTH'')
  AND xc.source = ''BACKEND''
  AND xc.destination = ''SERVICE''
and ts >= UNIX_TIMESTAMP(str_to_date(''01.02.16'',''%d.%m.%y''))*1000
and ts < UNIX_TIMESTAMP(str_to_date(''29.02.16'',''%d.%m.%y''))*1000
 group by pin_eq')


Заранее благодарен за помощь!
...
Рейтинг: 0 / 0
15.03.2016, 11:16
    #39192018
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
udzhin,

индексы на таблице какие?
explain показать можете?
...
Рейтинг: 0 / 0
15.03.2016, 11:24
    #39192029
udzhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
tanglir,

Код: 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.
*.log (
  id int(11) NOT NULL AUTO_INCREMENT,
  request_uid varchar(64) DEFAULT NULL COMMENT 'Хэш для ид',
  ts bigint(20) DEFAULT NULL COMMENT 'Текущее время в миллисекундах',
  environment varchar(64) DEFAULT NULL COMMENT 'среда',
  backend_system varchar(64) DEFAULT NULL,
  app_client varchar(64) DEFAULT NULL COMMENT 'Имя приложения с версией, которое запросило данные',
  app_os varchar(64) DEFAULT NULL COMMENT 'ОС',
  req_id int(11) DEFAULT NULL COMMENT 'Идентификатор пакета',
  ip_address varchar(64) DEFAULT NULL COMMENT 'IP',
  mac_address varchar(64) DEFAULT NULL COMMENT 'MAC',
  user varchar(64) DEFAULT NULL,
  source varchar(64) DEFAULT NULL COMMENT 'FRONTEND, BACKEND, SERVICE',
  destination varchar(64) DEFAULT NULL COMMENT 'FRONTEND, BACKEND, SERVICE',
  operation varchar(64) DEFAULT NULL,
  result_code int(11) DEFAULT NULL COMMENT 'Результирующий код (отрицательное значение означает ошибку)',
  message longtext DEFAULT NULL,
  model varchar(255) DEFAULT NULL COMMENT 'Наименование модели мобильного устройства',
  service_name varchar(128) DEFAULT NULL COMMENT 'Имя вызываемого сервиса',
  pin_eq varchar(64) DEFAULT NULL COMMENT 'Pin',
  imei varchar(30) DEFAULT NULL COMMENT 'IMEI',
  phone_number varchar(20) DEFAULT NULL COMMENT 'номер',
  sim_number varchar(20) DEFAULT NULL COMMENT 'симка',
  jailbreak tinyint(1) DEFAULT NULL COMMENT 'Признак jb',
  PRIMARY KEY (id),
  INDEX IX_log_ts (ts)
)
...
Рейтинг: 0 / 0
15.03.2016, 11:39
    #39192056
udzhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
tanglir,

по explain есть небольшая сложность, сейчас постараюсь оформить
...
Рейтинг: 0 / 0
15.03.2016, 11:45
    #39192068
udzhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
tanglir,

explain показать увы не смогу, запрос написан через openquery, а работаю в microsoft sql server management studio.
Из-за openquery не могу и Analyze Query in Database Engine Tuning Advisor воспользоваться
...
Рейтинг: 0 / 0
15.03.2016, 11:47
    #39192072
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
udzhinработаю в microsoft sql server management studio
Ну так задавайте вопрос в ветке MS SQL, а не MySQL...

Впрочем, на ненормализованных и неиндексированных данных ждать хоть какого-то улучшения бессмысленно.
...
Рейтинг: 0 / 0
15.03.2016, 11:55
    #39192086
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
udzhinexplain показать увы не смогу, запрос написан через openqueryНу тогда скажите хотя бы, сколько записей попадает под условие отбора, т.е.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
  count(*)
from log xc
where xc.user not in (''спец.учетка1'',''спец.учетка1'',''спец.учетка2'',''спец.учетка3'',''спец.учетка4'')
and xc.service_name like ''WSCustomerSearchClients%''
and xc.operation in(''AUTH'')
  AND xc.source = ''BACKEND''
  AND xc.destination = ''SERVICE''
and ts >= UNIX_TIMESTAMP(str_to_date(''01.02.16'',''%d.%m.%y''))*1000
and ts < UNIX_TIMESTAMP(str_to_date(''29.02.16'',''%d.%m.%y''))*1000
...
Рейтинг: 0 / 0
15.03.2016, 12:05
    #39192098
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
udzhinобычно запрашиваются данные за месяц.udzhin
Код: sql
1.
2.
and ts >= UNIX_TIMESTAMP(str_to_date(''01.02.16'',''%d.%m.%y''))*1000
and ts < UNIX_TIMESTAMP(str_to_date(''29.02.16'',''%d.%m.%y''))*1000

Так вы последний день февраля потеряете. Там надо 1 марта ставить.
...
Рейтинг: 0 / 0
15.03.2016, 12:52
    #39192190
udzhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
miksoftudzhinобычно запрашиваются данные за месяц.udzhin
Код: sql
1.
2.
and ts >= UNIX_TIMESTAMP(str_to_date(''01.02.16'',''%d.%m.%y''))*1000
and ts < UNIX_TIMESTAMP(str_to_date(''29.02.16'',''%d.%m.%y''))*1000

Так вы последний день февраля потеряете. Там надо 1 марта ставить.

да это-то понятно, написал ведь "обычно" :)

tanglirudzhinexplain показать увы не смогу, запрос написан через openqueryНу тогда скажите хотя бы, сколько записей попадает под условие отбора, т.е.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
  count(*)
from log xc
where xc.user not in (''спец.учетка1'',''спец.учетка1'',''спец.учетка2'',''спец.учетка3'',''спец.учетка4'')
and xc.service_name like ''WSCustomerSearchClients%''
and xc.operation in(''AUTH'')
  AND xc.source = ''BACKEND''
  AND xc.destination = ''SERVICE''
and ts >= UNIX_TIMESTAMP(str_to_date(''01.02.16'',''%d.%m.%y''))*1000
and ts < UNIX_TIMESTAMP(str_to_date(''29.02.16'',''%d.%m.%y''))*1000



в результирующей выгрузке за месяц без группировки - ~897 строк.
К слову добрался таки до самой БД, вот explain

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE xc range IX_log_ts IX_log_ts 9 (null) 3803496 Using where; Using temporary; Using filesort

На самой БД скрипт отработал за 3,5 минуты вместо 16,5...
...
Рейтинг: 0 / 0
15.03.2016, 12:52
    #39192193
udzhin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
897 тысяч*
...
Рейтинг: 0 / 0
15.03.2016, 13:38
    #39192242
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация запроса
А за сколько времени вы хотите, чтобы сервер вам вычитал, отсортировал и сгруппировал без малого миллион записей? Да ещё с промежуточной записью на диск...

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


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