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

Для начала надо разобраться с логикой запроса.
Либо уберите слово LEFT, либо условие cd.language_id = '2' перенесите в условие соединения.
...
Рейтинг: 0 / 0
Помогите оптимизировать запросы.
    #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
Помогите оптимизировать запросы.
    #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
Помогите оптимизировать запросы.
    #39513166
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bigbrother72language_id - язык описания категории - 1 русский, 2 - английскийВ таком случае условие cd.language_id = '2' просто ОБЯЗАНО находиться в секции ON.
...
Рейтинг: 0 / 0
Помогите оптимизировать запросы.
    #39513190
Darkripple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
возможно наличие описания на нужном языке является обязательным, тогда можно избавиться от "left".
еще я бы убрал `name` из первичного ключа, ибо не вижу там в этом поле другой пользы, кроме вреда.
...
Рейтинг: 0 / 0
Помогите оптимизировать запросы.
    #39513308
paver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinabigbrother72language_id - язык описания категории - 1 русский, 2 - английскийВ таком случае условие cd.language_id = '2' просто ОБЯЗАНО находиться в секции ON.
А где про это можно почитать?
Я как-то думал, что в ON условия связывания
...
Рейтинг: 0 / 0
Помогите оптимизировать запросы.
    #39513392
Darkripple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
paverА где про это можно почитать?
Я как-то думал, что в ON условия связывания www.mysqldiary.com/mysql-left-join/
в случае left join-а в ON надо включать все условия, связанные с "левой" таблицей, записи в которой могут отсутствовать по условию связывания.
...
Рейтинг: 0 / 0
Помогите оптимизировать запросы.
    #39513405
Darkripple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
хотя конечно вот так
Код: sql
1.
 WHERE c.parent_id = 47 AND ifnull(cd.language_id,2) = 2

тоже сработает
...
Рейтинг: 0 / 0
Помогите оптимизировать запросы.
    #39513441
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
paverЯ как-то думал, что в ON условия связыванияНе только связывания, но и пред-отбора (отбора, выполняемого ДО связывания), в то время как во WHERE находятся условия отбора, выполняемые ПОСЛЕ связывания.
...
Рейтинг: 0 / 0
Помогите оптимизировать запросы.
    #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
Помогите оптимизировать запросы.
    #39513636
bigbrother72
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bigbrother72,

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


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