[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Оптимизация JOIN запроса (MySQL)
sodroot
Доброго времени суток.
Знатоки помогите оптимизировать запрос поиска, выполняется 1,5-2 сек. (Это долго!)

Сам запрос:
SELECT *
FROM carSale AS t1
USE INDEX ( )
LEFT JOIN salerContacts AS t2 ON t1.salerContactId = t2.contactId
INNER JOIN carModels AS t3 ON t3.carModelId = t1.carModelId
LEFT JOIN carBrands AS t4 ON t4.carBrandId = t3.carBrandId
LEFT JOIN regions AS t5 ON t2.salerRegion = t5.regionId
LEFT JOIN savedsales AS ss ON ( t1.saleId = ss.saveSaleId
AND ss.userId =0
AND ss.saleTable = "carSale" )
LEFT JOIN salePhotos AS sP ON sP.photoSaleId = t1.saleId
AND sP.saleType =1
WHERE t1.saleOn =1
GROUP BY t1.saleId
ORDER BY t1.saleRaised DESC , t1.saleCreate DESC
LIMIT
9048 , 24

Заранее благодарен!

P.S. Тому кто поможет +1 в репу естественно! :)
waldicom
как же тут совет дать, когда данных мало.
Хотя бы explain на этот запрос сюда скопируйте.

_____________
Свои мозги еще никто не отменял.
Телепатов нету.
sodroot
Цитата (waldicom @ 24.05.2014 - 21:38)
как же тут совет дать, когда данных мало.
Хотя бы explain на этот запрос сюда скопируйте.

Вот скрин: _http://s1.ipicture.ru/uploads/20140525/5K1VTJK0.jpg
sergeiss
sodroot - а у тебя есть индексы по всем тем полям, что участвуют в связываниях, условиях, группировке и сортировке?

Второе. Лимит "LIMIT 9048 , 24" сработает так, что он сначала выберет 9048 строк, а только затем отсчитает 24 строки. Лучше установить в условии где-нибудь, что выбирать начиная с такой-то строки. Это будет быстрее.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
sodroot
Цитата (sergeiss @ 24.05.2014 - 22:02)
sodroot - а у тебя есть индексы по всем тем полям, что участвуют в связываниях, условиях, группировке и сортировке?

Второе. Лимит "LIMIT 9048 , 24" сработает так, что он сначала выберет 9048 строк, а только затем отсчитает 24 строки. Лучше установить в условии где-нибудь, что выбирать начиная с такой-то строки. Это будет быстрее.

"а у тебя есть индексы по всем тем полям, что участвуют в связываниях, условиях, группировке и сортировке?" - Да.

"Лучше установить в условии где-нибудь, что выбирать начиная с такой-то строки. Это будет быстрее." - Как это сделать?
sergeiss
Цитата (sodroot @ 25.05.2014 - 02:07)
Как это сделать?

Посмотрел повнимательнее... В твоем случае не получится. Если бы сортировка была по айди, то получилось бы.

Я вот другое смотрю сейчас. Зачем у тебя стоит "use index()" с пустым списком? Судя по explain, для таблицы t1 индексы не используют совсем. Хотя к ней делаются привязки других таблиц, сортировки, группировка. И все они без индексирования. Почему без индексирования?

PS. Для ряда таблиц, например savedsales, возможно, надо использовать составной ключ, т.к. там идет связывание сразу по 3-м полям (ss.saveSaleId, ss.userId, ss.saleTable = "carSale"). Аналогично, для таблицы salePhotos при связывании используются 2 поля сразу (sP.photoSaleId, sP.saleType); по ним тоже нужен составной ключ.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
sodroot
Цитата (sergeiss @ 24.05.2014 - 23:00)
Цитата (sodroot @ 25.05.2014 - 02:07)
Как это сделать?

Посмотрел повнимательнее... В твоем случае не получится. Если бы сортировка была по айди, то получилось бы.

Я вот другое смотрю сейчас. Зачем у тебя стоит "use index()" с пустым списком? Судя по explain, для таблицы t1 индексы не используют совсем. Хотя к ней делаются привязки других таблиц, сортировки, группировка. И все они без индексирования. Почему без индексирования?

PS. Для ряда таблиц, например savedsales, возможно, надо использовать составной ключ, т.к. там идет связывание сразу по 3-м полям (ss.saveSaleId, ss.userId, ss.saleTable = "carSale"). Аналогично, для таблицы salePhotos при связывании используются 2 поля сразу (sP.photoSaleId, sP.saleType); по ним тоже нужен составной ключ.

Не помогло ничего из перечисленного.
Нашел то что нужно по этой ссылке: _http://phpclub.ru/talk/threads/75237/ (обязательно прочитайте топик)
Теперь время выполнения запроса в среднем: 0.0926 сек
Спасибо всем что старались помочь cool.gif
sergeiss
Цитата (sodroot @ 25.05.2014 - 23:18)
Не помогло ничего из перечисленного.
Нашел то что нужно по этой ссылке....

Ну так рассказывай, что именно сделал smile.gif Мало ли, кто-то с подобной проблемой столкнется.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.