Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запросы. / 14 сообщений из 14, страница 1 из 1
30.08.2017, 21:45
    #39513041
bigbrother72
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
Есть запрос:

Код: sql
1.
SELECT * FROM category c LEFT JOIN category_description cd ON (c.category_id = cd.category_id) WHERE c.parent_id = '47' AND cd.language_id = '2' AND c.status = '1' ORDER BY c.sort_order, LCASE(cd.name)


EXPLAIN дает
Код: plaintext
1.
2.
3.
d 	select_type 	table 	partitions 	type 	possible_keys 	key 	key_len 	ref 	rows 	filtered 	Extra 	
1 	SIMPLE 	c 	NULL	ref 	PRIMARY,parent_id 	parent_id 	4 	const 	7 	10.00 	Using where; Using temporary; Using filesort
1 	SIMPLE 	cd 	NULL	ref 	PRIMARY 	PRIMARY 	8 	shop.c.category_id,const 	3 	100.00 	NULL
Если убираю ORDER BY c.sort_order, LCASE(cd.name) - то explain

Код: plaintext
1.
2.
3.
id 	select_type 	table 	partitions 	type 	possible_keys 	key 	key_len 	ref 	rows 	filtered 	Extra 	
1 	SIMPLE 	c 	NULL	ref 	PRIMARY,parent_id 	parent_id 	4 	const 	7 	10.00 	Using where
1 	SIMPLE 	cd 	NULL	ref 	PRIMARY 	PRIMARY 	8 	shop.c.category_id,const 	3 	100.00 	NULL
Вопрос - как изменить запрос или индексы какие дополнительные добавить?

p.s

Код: 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.
category 	CREATE TABLE `category` (
 `category_id` int(11) NOT NULL AUTO_INCREMENT,
 `image` varchar(255) DEFAULT NULL,
 `parent_id` int(11) NOT NULL,
 `top` tinyint(1) NOT NULL,
 `column` int(3) NOT NULL,
 `sort_order` int(3) NOT NULL,
 `status` tinyint(1) NOT NULL,
 `date_added` datetime DEFAULT NULL,
 `date_modified` datetime DEFAULT NULL,
 PRIMARY KEY (`category_id`),
 KEY `parent_id` (`parent_id`)
) ENGINE=MyISAM AUTO_INCREMENT=166 DEFAULT CHARSET=utf8
category_description 	CREATE TABLE `category_description` (
 `category_id` int(11) NOT NULL,
 `language_id` int(11) NOT NULL,
 `name` varchar(255) NOT NULL,
 `description` text NOT NULL,
 `meta_description` varchar(255) NOT NULL,
 `meta_keyword` varchar(255) NOT NULL,
 `seo_title` varchar(255) NOT NULL,
 `seo_h1` varchar(255) NOT NULL,
 `meta_title` varchar(255) NOT NULL,
 `page_h1` varchar(255) NOT NULL,
 PRIMARY KEY (`category_id`,`language_id`,`name`) USING BTREE,
 KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
...
Рейтинг: 0 / 0
30.08.2017, 23:42
    #39513074
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
bigbrother72,

Для начала надо разобраться с логикой запроса.
Либо уберите слово LEFT, либо условие cd.language_id = '2' перенесите в условие соединения.
...
Рейтинг: 0 / 0
31.08.2017, 08:29
    #39513149
bigbrother72
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
miksoft,

Логика такая:
Таблица category содержит
category_id
ссылку на родительскую категорию c.parent_id
sort_order - сортировка, указанная руками в таблице (если заполнена - сортируем по этому полю)
status - показывать категорию или нет.

Таблица category_description - здесь описание категорий.
category_id
language_id - язык описания категории - 1 русский, 2 - английский
name - само описание категорий (Яблоки,Бананы,Груши с language_id=1) (Apple,Banana etc с language_id=2)

Из двух таблиц выбираются данные отсортированные по c.sort_order из первой таблицы и LCASE(cd.name) из второй таблицы.
Таблицы связаны через c.category_id = cd.category_id
Условия выбора еще:
Родительская категория c.parent_id
Язык описания категории cd.language_id
Статус c.status
...
Рейтинг: 0 / 0
31.08.2017, 08:40
    #39513163
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
Order By выражение - это ВСЕГДА filesort, каких индексов не накрути...

Впрочем, если у тебя версия 5.7.6 или старше, можно использовать вычисляемые поля. См. https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html и https://dev.mysql.com/doc/refman/5.7/en/generated-column-index-optimizations.html
...
Рейтинг: 0 / 0
31.08.2017, 08:41
    #39513166
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
bigbrother72language_id - язык описания категории - 1 русский, 2 - английскийВ таком случае условие cd.language_id = '2' просто ОБЯЗАНО находиться в секции ON.
...
Рейтинг: 0 / 0
31.08.2017, 09:19
    #39513190
Darkripple
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
возможно наличие описания на нужном языке является обязательным, тогда можно избавиться от "left".
еще я бы убрал `name` из первичного ключа, ибо не вижу там в этом поле другой пользы, кроме вреда.
...
Рейтинг: 0 / 0
31.08.2017, 11:48
    #39513308
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
Akinabigbrother72language_id - язык описания категории - 1 русский, 2 - английскийВ таком случае условие cd.language_id = '2' просто ОБЯЗАНО находиться в секции ON.
А где про это можно почитать?
Я как-то думал, что в ON условия связывания
...
Рейтинг: 0 / 0
31.08.2017, 13:09
    #39513392
Darkripple
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
paverА где про это можно почитать?
Я как-то думал, что в ON условия связывания www.mysqldiary.com/mysql-left-join/
в случае left join-а в ON надо включать все условия, связанные с "левой" таблицей, записи в которой могут отсутствовать по условию связывания.
...
Рейтинг: 0 / 0
31.08.2017, 13:16
    #39513405
Darkripple
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
хотя конечно вот так
Код: sql
1.
 WHERE c.parent_id = 47 AND ifnull(cd.language_id,2) = 2

тоже сработает
...
Рейтинг: 0 / 0
31.08.2017, 13:50
    #39513441
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
paverЯ как-то думал, что в ON условия связыванияНе только связывания, но и пред-отбора (отбора, выполняемого ДО связывания), в то время как во WHERE находятся условия отбора, выполняемые ПОСЛЕ связывания.
...
Рейтинг: 0 / 0
31.08.2017, 18:45
    #39513634
bigbrother72
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
AkinaOrder By выражение - это ВСЕГДА filesort, каких индексов не накрути...


Почему же?
вот так например упростим пока:
SELECT * FROM category c WHERE c.parent_id = '47' AND c.status = '1' ORDER BY c.sort_order

добавим индекс "index2" по полям parent_id, status, sort_order

теперь explain нам говорит:
авторid select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE c NULL ref parent_id,status,index2 index2 5 const,const 7 92.19 Using index condition


пока не могу сообразить, как использовать в запросе два индекса из двух таблиц.
...
Рейтинг: 0 / 0
31.08.2017, 18:48
    #39513636
bigbrother72
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
bigbrother72,

хотя это не индекс, а Using index condition получилось
...
Рейтинг: 0 / 0
31.08.2017, 19:30
    #39513655
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
bigbrother72 , и где тут, позвольте узнать, выражение? Измените на какой-нибудь ORDER BY c.sort_order +1 и попробуйте избавиться от filesort.
...
Рейтинг: 0 / 0
01.09.2017, 06:52
    #39513777
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите оптимизировать запросы.
DarkripplepaverА где про это можно почитать?
Я как-то думал, что в ON условия связывания www.mysqldiary.com/mysql-left-join/
Показательно, спасибо
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запросы. / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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