Я сейчас работаю над веб-сайтом, который нуждается в некоторой оптимизации ... так как загрузка главной страницы занимает около 15-20 секунд, я подумал, что некоторая оптимизация будет хорошей.
Вот один запрос, который появился в журнале медленных запросов MySQL:
SELECT a.user,a.id
FROM `profil_perso` pp
INNER JOIN `acces` a ON pp.parrain = a.id
INNER JOIN `acces` ap ON ap.id = pp.id
WHERE pp.parrain_visibilite = '1'
AND a.actif = 1
GROUP BY a.id
ORDER BY ap.depuis DESC LIMIT 15;
На profil_perso
(~ 207K строк - содержит электронные письма и профили) есть perso_id
, который является первичным ключом, также есть id
(внешний ключ) + parrain
(реферер) + parrain_visibilite
(реферер показан), которые являются индексами.
На acces
есть id
, который является первичным ключом, также есть depuis (дата регистрации), который проиндексирован
Тест показывает это на самом деле:
Первый раз: 1.94532990456
Последний раз: 1.94532990456
Среднее время: 0.0389438009262
Я пытался выразиться так:
SELECT DISTINCT a.id, a.user
FROM `profil_perso` pp
LEFT JOIN `acces` a ON pp.parrain = a.id
WHERE pp.parrain_visibilite = 1
AND a.actif = 1
AND pp.id != 0
ORDER BY pp.id DESC LIMIT 15;
Тем не менее тест показывают это:
Первый раз: 1.96376991272
В прошлый раз: 1.96376991272
Среднее время: 0.0393264245987
Есть ли подсказка, чтобы уменьшить время запроса?
Вот полные индексы:
доступ:
id (primary)
derniere_visite -- last visit
pays_id -- country_id
depuis -- registration time
perso_id -- foreign key to profil_perso primary key
actif -- account status
compte_premium -- if account is premium
profil_perso:
perso_id (primary)
id -- foreign key to acces primary key
genre -- gender
parrain_visibilite -- visibility of referer
parrain -- referer
parrain_contexte
telephone
orientation
naissance -- birthdate
photo -- if it has a picture