powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация SQL запроса
11 сообщений из 11, страница 1 из 1
Оптимизация SQL запроса
    #38509905
Makaveli0007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите каким образом можно оптимизировать данный SQL запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT *, (SELECT 
              COUNT(*) 
            FROM
              gals_category IGNORE INDEX (combined) 
            WHERE gals_category.`category_id` = c.`category_id`) AS cgal,	    
          FROM
            categories AS c 
            JOIN categories_names AS cn 
              ON cn.`category_id` = c.`category_id` 
            WHERE cn.`lang_id`=1 AND c.`active`=1


В данный момент он выполняется 3-5 секунд, в таблице categories - 500 записей, в gals_category - 1.8 млн., в categories_names - 400тыс.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38509910
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makaveli0007,

а explain мы сами должны написать?
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38509932
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А подзапрос тут нафига?
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38509947
Makaveli0007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужно получить количество галлерей в категории, для этого делается подзапрос.

EXPLAIN:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
EXPLAIN SELECT c.`category_id`,c.`ctr`,c.`url`,c.`views`,c.`clicks`,cn.`title`,cn.`keywords`,cn.`description`,c.thumb,
            (SELECT 
              COUNT(*) 
            FROM
              gals_category IGNORE INDEX (combined) 
            WHERE gals_category.`category_id` = c.`category_id`) AS cgal 
          FROM
            categories AS c 
            JOIN categories_names AS cn 
              ON cn.`category_id` = c.`category_id` 
            WHERE cn.`lang_id`=1 AND c.`active`=1




Ответ:
Код: sql
1.
2.
3.
4.
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	PRIMARY	c	ALL	category_id,active	\N	\N	\N	486	Using where
1	PRIMARY	cn	ref	category_id,lang_id,combined	category_id	4	mychield.c.category_id	1	Using where
2	DEPENDENT SUBQUERY	gals_category	ref	category_id	category_id	5	mychield.c.category_id	3248	Using where; Using index
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38509978
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makaveli0007для этого делается подзапросДля этого не нужен подзапрос.
перенесите таблицу в секцию FROM, введите нужную группировку, и вместо абстрактных звёздочек укажите конкретные поля. И всё полетит.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38509991
Makaveli0007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непонимаю, каким образом можно перенести в from данный подзапрос.

Подскажите пожалуйста, заранее благодарю.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38510024
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DEPENDENT SUBQUERY
выполняется на каждую строчку основного запроса.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38510044
Makaveli0007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ScareCrowDEPENDENT SUBQUERY
выполняется на каждую строчку основного запроса.
Я понимаю, но другого решения я незнаю, Akin подсказала, но я незнаю как составить такой SQL запрос
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38510051
Makaveli0007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Структура таблиц:
Код: 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.
CREATE TABLE `categories` (
  `category_id` int(11) NOT NULL AUTO_INCREMENT,
  `views` int(11) DEFAULT '0',
  `clicks` int(11) DEFAULT '0',
  `ctr` double DEFAULT '0',
  `url` varchar(255) DEFAULT NULL,
  `active` int(11) DEFAULT '0',
  `thumb` varchar(255) DEFAULT NULL,
  KEY `category_id` (`category_id`),
  KEY `ctr` (`ctr`),
  KEY `active` (`active`)
) ENGINE=InnoDB AUTO_INCREMENT=515 DEFAULT CHARSET=utf8;


CREATE TABLE `categories_names` (
  `category_names_id` int(11) NOT NULL AUTO_INCREMENT,
  `category_id` int(11) NOT NULL,
  `lang_id` int(11) NOT NULL,
  `title` varchar(255) DEFAULT NULL,
  `keywords` varchar(255) DEFAULT NULL,
  `description` varchar(255) DEFAULT NULL,
  KEY `category_names_id` (`category_names_id`),
  KEY `category_id` (`category_id`),
  KEY `lang_id` (`lang_id`),
  KEY `combined` (`category_id`,`lang_id`)
) ENGINE=InnoDB AUTO_INCREMENT=514 DEFAULT CHARSET=utf8;


CREATE TABLE `gals_category` (
  `gals_category_id` int(11) NOT NULL AUTO_INCREMENT,
  `gal_id` int(11) DEFAULT NULL,
  `category_id` int(11) DEFAULT NULL,
  KEY `gals_category_id` (`gals_category_id`),
  KEY `combined` (`gal_id`,`category_id`),
  KEY `category_id` (`category_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1675305 DEFAULT CHARSET=utf8;
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38510104
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Makaveli0007но я незнаю как составить такой SQL запросСоставить-то нехитро:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT c.*, cn.*, t.cnt
FROM categories AS c 
  JOIN categories_names AS cn 
    ON cn.`category_id` = c.`category_id` 
  JOIN (SELECT category_id, COUNT(*) cnt FROM gals_category GROUP BY category_id) t
    ON t.category_id=c.`category_id`
WHERE cn.`lang_id`=1 AND c.`active`=1

Но вот даст ли это ускорение - не факт, зависит от статистики данных.
...
Рейтинг: 0 / 0
Оптимизация SQL запроса
    #38510169
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я немного разверну запрос из EXPLAIN

Код: 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.
SELECT
  c.`category_id`
, c.`ctr`
, c.`url`
, c.`views`
, c.`clicks`
, cn.`title`
, cn.`keywords`
, cn.`description`
, c.thumb
, ( SELECT 
      COUNT(*) 
    FROM
      gals_category IGNORE INDEX (combined) 
    WHERE
      gals_category.`category_id` = c.`category_id`
    ) AS cgal 

FROM
  categories AS c 
JOIN
  categories_names AS cn 
ON
  cn.`category_id` = c.`category_id` 

WHERE
  cn.`lang_id`=1 
AND
  c.`active`=1



Вот... а теперь смотрим. Ты берёшь вполне конкретную груду полей из соединения таблиц categories и categories_name. Потом для каждой c.`category_id` в коррелированном запросе считаешь количество связанных записей в gals_category... теперь осталось понять, в каком отношении находятся таблицы categories и categories_name - из DDL этого не видно. Названия наводят на мысль, что с учётом cn.`lang_id`=1 мы имеем 1:1.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация SQL запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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