powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как оптимизировать запрос?
13 сообщений из 13, страница 1 из 1
Как оптимизировать запрос?
    #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
Как оптимизировать запрос?
    #39509379
Victor256,

Как часто и насколько сильно изменяется количественный состав данных в таблицах? Может нет смысла каждый раз выполнять запрос, а сделать некую табличку с результатом этого запроса и обновлять Ее периодические по мере необходимости?
...
Рейтинг: 0 / 0
Как оптимизировать запрос?
    #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
Как оптимизировать запрос?
    #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
Как оптимизировать запрос?
    #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
Как оптимизировать запрос?
    #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
Как оптимизировать запрос?
    #39512991
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor256
MasterZivКроме этого, и финальный запрос, для которого делается пагинация, тоже, подозреваю, идиотский.
Сколько у тебя там будет записей ? 200 тыщ ?

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



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

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

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

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

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

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

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


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