- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Тренды маркетинга в 2024 году: мобильные продажи, углубленная аналитика и ИИ
Экспертная оценка Адмитад
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Не могу придумать как оптимизировать этот запрос:
AS item_alias, CONCAT_WS('-', t2.id, t2.alias)
AS section_alias,
MIN(t3.price) as item_price
FROM xfd3_lekarstva_analogs AS t0
LEFT JOIN xfd3_lekarstva_items AS t1 ON t0.analog_id = t1.id
LEFT JOIN xfd3_lekarstva_sections AS t2 ON t1.section_id = t2.id
left join xfd3_lekarstva_price2 as t3 on t3.original = t1.name
WHERE t0.item_id = '29076' GROUP BY id
ORDER BY analog_id DESC,item_price ASC LIMIT 5
Он выполняется порядка 2 сек. Вот его EXPLAIN
Насколько мне хватает скудных знаний - проблема в таблице xfd3_lekarstva_price2, вот ее структура
`id` int(11) NOT NULL,
`available` varchar(255) CHARACTER SET utf8 NOT NULL,
`categoryId` varchar(255) CHARACTER SET utf8 NOT NULL,
`country_of_origin` varchar(255) CHARACTER SET utf8 NOT NULL,
`currencyId` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`description` blob NOT NULL,
`modified_time` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`oldprice` float NOT NULL,
`picture` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`price` float NOT NULL,
`type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`url` blob NOT NULL,
`original` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Индексы сохранённых таблиц
--
--
-- Индексы таблицы `xfd3_lekarstva_price2`
--
ALTER TABLE `xfd3_lekarstva_price2`
ADD PRIMARY KEY (`id`),
ADD KEY `price` (`price`),
ADD KEY `name` (`name`(50)) USING BTREE;
COMMIT;
Посоветуйте плиз где поколдовать?
ALTER TABLE `xfd3_lekarstva_price2` ADD KEY `original` (`original`);
ALTER TABLE `xfd3_lekarstva_items` ADD KEY `name` (`name`);
В целом принцип такой, что поля, участвующие в сравнении (where, join) и сортировке (order, group) должны быть проиндексированы. Все не нужно.
Кроме того, следует подумать о целесообразности LEFT JOIN (почему не INNER JOIN?) и агрегирующих функций (MIN,GROUP) - возможно следует рассчитать заранее?
ALTER TABLE `xfd3_lekarstva_price2` ADD KEY `original` (`original`);
ALTER TABLE `xfd3_lekarstva_items` ADD KEY `name` (`name`);
Большое спасибо, Индекс name уже был, а вот индекс original очень здорово помог, благодарю!
Большое спасибо, Индекс name уже был, а вот индекс original очень здорово помог, благодарю!
Вообще индексы по хорошему надо ставить на все поля, участвующие в JOIN, WHERE и т.д. Это всегда помогает. Причем, если идет, например, WHERE id=:id AND type=:type, то делаем один индекс на оба поля - так еще быстрее.
Вообще индексы по хорошему надо ставить на все поля, участвующие в JOIN, WHERE
Это не по-хорошему. Т.к. запутает оптимизатор СУБД и плюс будет тормозить INSERT, UPDATE. Тут с умом нужно или с экспериментами. Все поля не нужно.
На этом форуме это не работает, проверено :p
Это не по-хорошему. Т.к. запутает оптимизатор СУБД и плюс будет тормозить INSERT, UPDATE. Тут с умом нужно или с экспериментами. Все поля не нужно.
Так тогда нужно баланс оптимальный подбирать между чтением и записью (по времени).
На этом форуме это не работает, проверено :p
Это не есть хорошо🤪
Ещё индекс на xfd3_lekarstva_analogs.item_id
Ещё индекс на xfd3_lekarstva_analogs.item_id
Он есть, на плане запроса же видно.
А вот с этим запросом такой фокус не прошел почему-то
AS item_alias, CONCAT_WS('-', t3.id, t3.alias) AS category_alias, CONCAT_WS('-', t4.id, t4.alias) AS section_alias
FROM xfd3_comments_items AS t1
INNER JOIN xfd3_clinics_items AS t2 ON t1.object_id = t2.id
AND t1.object_group = 'com_clinics'
LEFT JOIN xfd3_clinics_sections AS t4 ON t2.section_id = t4.id
LEFT JOIN xfd3_clinics_categories AS t3 ON t2.category_id = t3.id
ORDER BY t1.id DESC LIMIT 3
на фото индексы таблицы xfd3_clinics_items. Я пробовал добавлять индексы на поля section_id и object_id - это не изменило эксплейн
А вот с этим запросом такой фокус не прошел почему-то
на фото индексы таблицы xfd3_clinics_items. Я пробовал добавлять индексы на поля section_id и object_id - это не изменило эксплейн
Так у вас нету ключей для section_id и object_id. Вместо них есть ключи с такими же именами, но состоящие из нескольких полей.
В MySQL тупо сделано с этими объединениями ключей по-умолчанию, что порождает неочевидное новичкам поведение.
Удалите из групповых индексов все посторонние поля, оставьте только section_id и object_id в каждом соответствующем индексе.
Удаление составных индексов и добавление отдельных на эти поля не изменили эксплейн