Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос? / 13 сообщений из 13, страница 1 из 1
23.08.2017, 14:03
    #39509334
Victor256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Приветствую! Есть такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT COUNT(*) 
FROM cfirm_ads AS a 
LEFT JOIN users AS u ON u.id = a.id 
LEFT JOIN users_extra AS e ON e.user_id = a.id 
LEFT JOIN users AS m ON u.manager_id = m.id 
LEFT JOIN users AS mm ON a.id = mm.firm_id 
LEFT JOIN users_acct AS acc ON mm.id = acc.user_id 


Он считает кол-во строк, и потом в соотв. с этим рисует пагинацию. Проблема в том, что этот запрос выполняется примерно 4-5 секунд.

План:
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsExtra1SIMPLEaNULLindexNULLPRIMARY4NULL252651Using index; Using temporary1SIMPLEuNULLeq_refPRIMARYPRIMARY4---.a.id11SIMPLEeNULLeq_refPRIMARYPRIMARY4---.a.id1Using index1SIMPLEmNULLeq_refPRIMARYPRIMARY4---.u.manager_id1Using index1SIMPLEmmNULLreffirm_idfirm_id5---.a.id11SIMPLEaccNULLrefuser_iduser_id4---.mm.id2Using index
Индексы по всем полям присутствуют. Количество строк во всех таблицах, кроме users_acct примерно 260 тыс. В users_acct ~6000 строк. Движок MyISAM.

Подскажите, что можно тут улучшить?
...
Рейтинг: 0 / 0
23.08.2017, 14:41
    #39509379
Как оптимизировать запрос?
Victor256,

Как часто и насколько сильно изменяется количественный состав данных в таблицах? Может нет смысла каждый раз выполнять запрос, а сделать некую табличку с результатом этого запроса и обновлять Ее периодические по мере необходимости?
...
Рейтинг: 0 / 0
23.08.2017, 15:01
    #39509397
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
1) Оцените количество записей в связываниях (u-m) и в (mm-acc). Результат в студию.
2) Убедитесь, что Вам ДЕЙСТВИТЕЛЬНО не жить без левых связываний. Если не сможете - замените все или часть на внутренние.
3) Измените порядок связывания. Возможно, на a-e-u-m-mm-acc. Возможно, на a-e-(u-m)-(mm-acc).

Victor256Индексы по всем полям присутствуют.DDL всех таблиц в студию (почистив от ненужных для связывания полей).
...
Рейтинг: 0 / 0
23.08.2017, 17:02
    #39509461
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Victor256Приветствую! Есть такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT COUNT(*) 
FROM cfirm_ads AS a 
LEFT JOIN users AS u ON u.id = a.id 
LEFT JOIN users_extra AS e ON e.user_id = a.id 
LEFT JOIN users AS m ON u.manager_id = m.id 
LEFT JOIN users AS mm ON a.id = mm.firm_id 
LEFT JOIN users_acct AS acc ON mm.id = acc.user_id 


Он считает кол-во строк, и потом в соотв. с этим рисует пагинацию. Проблема в том, что этот запрос выполняется примерно 4-5 секунд.

План:
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsExtra1SIMPLEaNULLindexNULLPRIMARY4NULL252651Using index; Using temporary1SIMPLEuNULLeq_refPRIMARYPRIMARY4---.a.id11SIMPLEeNULLeq_refPRIMARYPRIMARY4---.a.id1Using index1SIMPLEmNULLeq_refPRIMARYPRIMARY4---.u.manager_id1Using index1SIMPLEmmNULLreffirm_idfirm_id5---.a.id11SIMPLEaccNULLrefuser_iduser_id4---.mm.id2Using index
Индексы по всем полям присутствуют. Количество строк во всех таблицах, кроме users_acct примерно 260 тыс. В users_acct ~6000 строк. Движок MyISAM.

Подскажите, что можно тут улучшить?

Ничего. В запросе нет SARG-ов, нечего оптимизировать, кроме JOIN-ов. Если на все условия JOIN-а есть индексы в дочерних (правых) таблицах, то более ничем запросу не помочь.

Кроме этого, и финальный запрос, для которого делается пагинация, тоже, подозреваю, идиотский.
Сколько у тебя там будет записей ? 200 тыщ ?
...
Рейтинг: 0 / 0
30.08.2017, 14:00
    #39512807
Victor256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Добрый Э - ЭхVictor256,

Как часто и насколько сильно изменяется количественный состав данных в таблицах? Может нет смысла каждый раз выполнять запрос, а сделать некую табличку с результатом этого запроса и обновлять Ее периодические по мере необходимости?
к сожалению, все таблицы активно обновляются

Akina1) Оцените количество записей в связываниях (u-m) и в (mm-acc). Результат в студию.
2) Убедитесь, что Вам ДЕЙСТВИТЕЛЬНО не жить без левых связываний. Если не сможете - замените все или часть на внутренние.
3) Измените порядок связывания. Возможно, на a-e-u-m-mm-acc. Возможно, на a-e-(u-m)-(mm-acc).

Victor256Индексы по всем полям присутствуют.DDL всех таблиц в студию (почистив от ненужных для связывания полей).
1) ~260к в обоих случаях
2) не соображу, как это можно сделать?
3) a-e-u-m-mm-acc попробовал, те же яйца. А что такое a-e-(u-m)-(mm-acc)?

MasterZivНичего. В запросе нет SARG-ов, нечего оптимизировать, кроме JOIN-ов. Если на все условия JOIN-а есть индексы в дочерних (правых) таблицах, то более ничем запросу не помочь.

Кроме этого, и финальный запрос, для которого делается пагинация, тоже, подозреваю, идиотский.
Сколько у тебя там будет записей ? 200 тыщ ?
даже больше, 260к записей в итоге. Тут весь сайт такой. Один сложный проблемный запрос улучшить удалось, но для этого пришлось переделывать логику работы. Но там хоть были варианты, а с этим вообще не могу придумать ничего. Он простой как двери.

Таблицы:

Код: 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.
DROP TABLE IF EXISTS `cfirm_ads`;
CREATE TABLE `cfirm_ads` (
  `id` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `pay` (`pay`),
  KEY `show_catalog` (`show_catalog`),
  KEY `c_headline` (`c_headline`(1),`show_catalog`),
  KEY `c_country` (`c_country`),
  KEY `c_region` (`c_region`),
  KEY `manager_id` (`manager_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `manager_id` int(10) NOT NULL,
  `firm_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `usertype` (`usertype`),
  KEY `idx_name` (`name`),
  KEY `idxemail` (`email`),
  KEY `username` (`username`),
  KEY `firm_id` (`firm_id`),
  KEY `manager_id` (`manager_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `users_acct`;
CREATE TABLE `users_acct` (
  `acct` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`acct`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


DROP TABLE IF EXISTS `users_extra`;
CREATE TABLE `users_extra` (
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


...
Рейтинг: 0 / 0
30.08.2017, 14:57
    #39512858
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Victor256что такое a-e-(u-m)-(mm-acc)?
a-b-c == from a join b on a.a=b.a join с on b.b=c.b
a-(b-c)== from a join (b join с on b.b=c.b) on a.a=b.a
...
Рейтинг: 0 / 0
30.08.2017, 18:42
    #39512991
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Victor256
MasterZivКроме этого, и финальный запрос, для которого делается пагинация, тоже, подозреваю, идиотский.
Сколько у тебя там будет записей ? 200 тыщ ?

даже больше, 260к записей в итоге. Тут весь сайт такой. Один сложный проблемный запрос улучшить удалось, но для этого пришлось переделывать логику работы. Но там хоть были варианты, а с этим вообще не могу придумать ничего. Он простой как двери.



ну и кому нужен запрос, выдающий 260 тыщ записей?

Ставь в финальный запрос в конец LIMIT 2000, а вместо подсчётного напиши SELECT 2000, -- и все дела оптимизации.
Дебильные не нужные никому запросы не нужно оптимизировать.
...
Рейтинг: 0 / 0
31.08.2017, 15:04
    #39513493
Victor256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
MasterZivну и кому нужен запрос, выдающий 260 тыщ записей?

Ставь в финальный запрос в конец LIMIT 2000, а вместо подсчётного напиши SELECT 2000, -- и все дела оптимизации.
Дебильные не нужные никому запросы не нужно оптимизировать.
ты наверно не понял. Это всего 260к записей. Но выбираются они через лимит: LIMIT 55555, 10
...
Рейтинг: 0 / 0
31.08.2017, 16:06
    #39513536
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Victor256LIMIT 55555, 10Такой лимит не может не тормозить... пока он там 55 тыщ отсчитает...
...
Рейтинг: 0 / 0
01.09.2017, 10:18
    #39513873
Victor256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
AkinaVictor256LIMIT 55555, 10Такой лимит не может не тормозить... пока он там 55 тыщ отсчитает...
тогда, какой выход? По id не получится, записи могут удаляться.
...
Рейтинг: 0 / 0
01.09.2017, 20:25
    #39514304
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Victor256Akinaпропущено...
Такой лимит не может не тормозить... пока он там 55 тыщ отсчитает...
тогда, какой выход? По id не получится, записи могут удаляться.

Условие ORDER BY инвертировать ( в другом порядке чтобы) и LIMIT 10

Но и такой запрос не сильно хороший, поскольку он будет обрабатывать ВСЕ записи, а только затем отбирать 10.
Сортироваться будут также (почти) все записи.

Но главное даже не это, я вовсе не уверен, что там у тебя вообще запрос правильный.
Подозреваю, у тебя JOIN-ятся к родителю несколько 1:N параллельно, это будет множить записи в дочерних параллельных таблицах.
Хотя, проверить это я не могу.
...
Рейтинг: 0 / 0
04.09.2017, 09:50
    #39514871
Victor256
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
MasterZiv
Подозреваю, у тебя JOIN-ятся к родителю несколько 1:N параллельно, это будет множить записи в дочерних параллельных таблицах.
Хотя, проверить это я не могу.
а что это значит?
...
Рейтинг: 0 / 0
04.09.2017, 11:32
    #39514935
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимизировать запрос?
Victor256MasterZivПодозреваю, у тебя JOIN-ятся к родителю несколько 1:N параллельно, это будет множить записи в дочерних параллельных таблицах.
Хотя, проверить это я не могу.
а что это значит?

Ну как же тебе объяснить, если не понимаешь ?
ПРоверь просто, что дочерние записи не двоятся. users_extra, users_acct...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос? / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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