Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация SQL запроса / 11 сообщений из 11, страница 1 из 1
23.12.2013, 13:26:28
    #38509905
Makaveli0007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
Подскажите каким образом можно оптимизировать данный 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
23.12.2013, 13:28:45
    #38509910
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
Makaveli0007,

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

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
23.12.2013, 14:20:18
    #38509978
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
Makaveli0007для этого делается подзапросДля этого не нужен подзапрос.
перенесите таблицу в секцию FROM, введите нужную группировку, и вместо абстрактных звёздочек укажите конкретные поля. И всё полетит.
...
Рейтинг: 0 / 0
23.12.2013, 14:25:59
    #38509991
Makaveli0007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
Непонимаю, каким образом можно перенести в from данный подзапрос.

Подскажите пожалуйста, заранее благодарю.
...
Рейтинг: 0 / 0
23.12.2013, 14:46:51
    #38510024
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
DEPENDENT SUBQUERY
выполняется на каждую строчку основного запроса.
...
Рейтинг: 0 / 0
23.12.2013, 14:57:08
    #38510044
Makaveli0007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
ScareCrowDEPENDENT SUBQUERY
выполняется на каждую строчку основного запроса.
Я понимаю, но другого решения я незнаю, Akin подсказала, но я незнаю как составить такой SQL запрос
...
Рейтинг: 0 / 0
23.12.2013, 15:02:51
    #38510051
Makaveli0007
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
Структура таблиц:
Код: 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
23.12.2013, 15:54:08
    #38510104
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
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
23.12.2013, 16:32:10
    #38510169
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация SQL запроса
Я немного разверну запрос из 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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизация SQL запроса / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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