Оптимизация запроса к mysql

N3K

Новичок
Есть довольно объемный запрос к базе данных. Индексы проверил - идет по ним. Вот собственно сам запрос:
PHP:
SELECT SQL_CALC_FOUND_ROWS 
company.*,act.message AS new_message, tarif.name as tarifName, 
tarif.order as tarifOrder,country.name as countryName, area.name as areaName, 
city.name as cityName,domains.navigation as domain 
FROM jos_repo_c as company 
LEFT JOIN jos_repo_activities AS act ON act.company_id = company.id 
LEFT JOIN jos__dir_table_name_country AS country ON country.id = company.country 
LEFT JOIN jos_dir_area AS area ON area.id = company.area 
LEFT JOIN jos_dir_cities AS city ON city.id = company.city 
LEFT JOIN jos_repo_tariff_plan as tarif ON company.tarif = tarif.id 
LEFT JOIN jos_repo_subdomains AS domains ON domains.repo_id = company.id AND domains.repo = 'jos_repo_c' 
WHERE (company.shsite = 1 AND company.trash IS NULL AND	 ((company.`city` = '1194') OR (company.`city` = '0' AND company.`area` = '91') 
OR 
(company.`city` = '0' AND company.`area` = '0' AND company.`country` = '3') 
OR 
(company.`city` = '0' AND company.`area` = '0' AND company.`country` = '0')) ) 
GROUP BY company.`id` ORDER BY company.`tarif` DESC, company.`countview` 
DESC LIMIT 0,10
Записей в основной таблице около 40к, подключаемые таблицы имеют в основном 10-20 и 300-1000 записей.
Запрос тратит больше всего времени на создание темповых таблиц для подключаемых таблиц.

starting 0.000018
checking query cache for query 0.000104
checking permissions 0.000004
checking permissions 0.000003
checking permissions 0.000003
checking permissions 0.000002
checking permissions 0.000003
checking permissions 0.000003
checking permissions 0.000004
Opening tables 0.000020
System lock 0.000007
Table lock 0.000048
init 0.000084
optimizing 0.000024
statistics 0.000664
preparing 0.000043
Creating tmp table 0.000347
Sorting for group 0.111150
executing 0.000018
Copying to tmp table 0.453444
Sorting result 0.152315
Sending data 0.056218
end 0.000018
removing tmp table 0.041661
end 0.000024
query end 0.000005
freeing items 0.000105
storing result in query cache 0.000020
logging slow query 0.000003
cleaning up 0.000010
Есть возможность загнать некоторые таблицы в темповые сразу, что б они не тратили время на это в каждом запросе, или как можно решить эту проблему по другому?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Структуры таблиц и експлайн в студию
 

prolis

Новичок
Пока ТС не привел структуру таблиц, выскажу замечания, которые бросились в глаза:
1. Целесообразность использования группировки при отсутвии в результате группирующих функций, можно заменить на distinct.
2. Как следствие п1. будет возможно использовать составной индекс к company, что бы существенно ограничить выборку из 40к записей. Хотя тут сомнения по селективности участвующих в выборке полей, но тогда составной индекс для сортировки результата.
3."company.`city` = '1194'" - пустячек, но неприятно обращение с цифровыми значениями поля
4.Целесообразность использования именно левого соединения (страна, город, регион)
5. Так и просится преобразовать к условию: company.city in (0, 1194) and company.area in (0, 91) (попытаться избавиться от OR, потому что один и тот же город не может быть в двух странах или регионах одновременно)
 
Сверху