Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Нужна помощь с оптимизацией запроса (ключи) / 11 сообщений из 11, страница 1 из 1
21.08.2014, 20:38:52
    #38726057
Stanislav WEB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запроса (ключи)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
EXPLAIN SELECT `t`.*, COUNT(DISTINCT ti0.cat_id) AS tag_count
FROM (`catalogue_tags` AS t)
LEFT JOIN `catalogue_tags_items` AS ti0 ON `t`.`id` = `ti0`.`tag_id`
LEFT JOIN `catalogue` AS c ON `c`.`cat_id` = `ti0`.`cat_id`
WHERE `t`.`id` NOT IN (100) 
AND `t`.`parent_id` NOT IN (100) 
GROUP BY `t`.`id`
ORDER BY `t`.`parent_id`, COUNT(DISTINCT ti0.cat_id) DESC, `t`.`title` 



автор1 SIMPLE t range PRIMARY PRIMARY 4 NULL 87 Using where; Using temporary; Using filesort
1 SIMPLE ti0 ref tag_id tag_id 4 backend.t.id 494 Using index
1 SIMPLE c eq_ref PRIMARY,cat_id PRIMARY 4 backend.ti0.cat_id 1 Using index

и второй запрос (выполняется 22 секунды) тут более сложный поиск по диапазонам

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
EXPLAIN SELECT c.*, cs2.id AS csid, cs2.parent, cs2.shop, cs2.sort, COUNT(DISTINCT ci.item_id) AS count_items, GROUP_CONCAT(DISTINCT cs.shop) AS shops
FROM (`catalogue_categories` AS c)
LEFT JOIN `catalogue_categories_join_shop` AS cs ON `cs`.`category` = `c`.`id`
RIGHT JOIN `catalogue_categories_join_shop` AS cs2 ON `cs2`.`category` = `c`.`id` AND cs2.shop = 1
LEFT JOIN `catalogue_categories_items` AS ci ON `ci`.`cat_id` = `c`.`id`
WHERE `c`.`status` IN (1) 
GROUP BY `cs`.`category`, `cs2`.`category`, `ci`.`cat_id`
ORDER BY `cs2`.`shop`, `cs2`.`parent`, `cs2`.`sort` ASC




автор1 SIMPLE cs2 ref category,shop shop 4 const 72 Using where; Using temporary; Using filesort
1 SIMPLE c eq_ref PRIMARY PRIMARY 4 backend.cs2.category 1 Using where
1 SIMPLE cs ref category category 4 backend.cs2.category 3
1 SIMPLE ci ref PRIMARY PRIMARY 4 backend.cs2.category 617 Using index
...
Рейтинг: 0 / 0
21.08.2014, 21:07:11
    #38726072
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запроса (ключи)
Stanislav WEB,

По первому запросу:

1. заменить последнюю строчку на
ORDER BY `t`.`parent_id`, 2 DESC, `t`.`title`

2. Есть ли каталог_таг записи без цаталог_таг_айтемс записей?

если нет, то можно убрать оба "ЛЕФТ"

3. если нужно ввобше очень быстро то можно подумать за
денормализацию.
...
Рейтинг: 0 / 0
21.08.2014, 21:17:29
    #38726076
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запроса (ключи)
Во втором запросе слово RIGHT можно смело убирать.
...
Рейтинг: 0 / 0
21.08.2014, 21:25:29
    #38726080
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запроса (ключи)
по второму запросу

(вот где ScareCrow раздолье!)

1. проверьте логику групировки и показа полей.
У вас будет работать если связка C и CS2(shop=1)
является один-к-одному. Это не очевидно из таблиц
и указывает на возможную ошибку дезайна.

2. можно избежать второй раз жоинить на туже таблицу
(CS and CS2) если в групе СЕЛЕКТ поставить условию типа
вместо
cs2.parent,
будет
max(if(cs.shop=1, cs.parent,null)) AS cs_parent_shop_1
...
Рейтинг: 0 / 0
21.08.2014, 21:28:43
    #38726081
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запроса (ключи)
miksoftВо втором запросе слово RIGHT можно смело убирать.


по логике вешей -- да, но формально --не уверен
фактически ето ЛЕФТ Жоин от CS2
...
Рейтинг: 0 / 0
21.08.2014, 21:31:30
    #38726083
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запроса (ключи)
javajdbcmiksoftВо втором запросе слово RIGHT можно смело убирать.


по логике вешей -- да, но формально --не уверен
фактически ето ЛЕФТ Жоин от CS2Именно формально. По причине WHERE `c`.`status` IN (1)
...
Рейтинг: 0 / 0
21.08.2014, 21:48:24
    #38726089
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запроса (ключи)
miksoftjavajdbcпропущено...



по логике вешей -- да, но формально --не уверен
фактически ето ЛЕФТ Жоин от CS2Именно формально. По причине WHERE `c`.`status` IN (1)


да, понятно. согласен.
...
Рейтинг: 0 / 0
22.08.2014, 13:06:27
    #38726585
Stanislav WEB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запроса (ключи)
javajdbc,

Спасибо большое, сейчас буду пробовать и отпишусь о результатах
...
Рейтинг: 0 / 0
22.08.2014, 14:16:12
    #38726714
Stanislav WEB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запроса (ключи)
По первому просто, вот как сделал по Второму, да ,
я убрал RIGHT
из за этого отобрал по parent где IS NOT NULL,
и отменил сортировку по shop_id так как в условии он является константой
в итоге такой же результат и время выполнения 0.125 sec

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT c.*, cs2.id AS csid, cs2.parent, cs2.shop, cs2.sort, COUNT(DISTINCT ci.item_id) AS count_items, GROUP_CONCAT(DISTINCT cs.shop) AS shops
FROM (`catalogue_categories` AS c)
LEFT JOIN `catalogue_categories_join_shop` AS cs ON `cs`.`category` = `c`.`id`
RIGHT JOIN `catalogue_categories_join_shop` AS cs2 ON `cs2`.`category` = `c`.`id` AND cs2.shop = 1
LEFT JOIN `catalogue_categories_items` AS ci ON `ci`.`cat_id` = `c`.`id`
WHERE `c`.`status` IN (1) 
GROUP BY `cs`.`category`, `cs2`.`category`, `ci`.`cat_id`
ORDER BY `cs2`.`shop`, `cs2`.`parent`, `cs2`.`sort` ASC
...
Рейтинг: 0 / 0
22.08.2014, 14:17:25
    #38726718
Stanislav WEB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запроса (ключи)
Прошу прощения.. Вот

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT c.*, cs.id AS csid, max(if(cs.shop=1, cs.parent,null)) AS parent, cs.shop, cs.sort, COUNT(DISTINCT ci.item_id) AS count_items, GROUP_CONCAT(DISTINCT cs.shop) AS shops
FROM (`catalogue_categories` AS c)
LEFT JOIN `catalogue_categories_join_shop` AS cs ON `cs`.`category` = `c`.`id` AND cs.shop = 1
LEFT JOIN `catalogue_categories_items` AS ci ON `ci`.`cat_id` = `c`.`id`
WHERE `c`.`status` IN (1) AND cs.parent IS NOT NULL
GROUP BY `cs`.`category`, `cs`.`category`, `ci`.`cat_id`
ORDER BY parent, `cs`.`sort` ASC
...
Рейтинг: 0 / 0
22.08.2014, 15:59:04
    #38726879
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нужна помощь с оптимизацией запроса (ключи)
Stanislav WEB,

по поледнему СКЛ-у:

LEFT JOIN `catalogue_categories_join_shop` AS cs ON `cs`.`category` = `c`.`id` AND cs.shop = 1


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


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