Внесу свои 5 копеек для оптимизации SE 3.20
И так шаги для анализа...
Включите лог медленных запросов
в [mysqld] секции my.cnf:
# Минимальное время запроса, которое не будет помещено в лог.
long_query_time=10
# Файл в котором будут отображаться слишком долгие запросы.
# можно использовать опцию -mysqld -log-slow-queries=file
log-slow-queries=/var/log/mysqld/slowquery.log
Для ведения полного лога всех запросов, нужно использовать опцию mysqld --log=allquery.log
Через какое то N время смотри данный логи и находит....
Беру один для пример...
PHP:
SELECT
`se_profilecomments`.*,
se_users.user_id,
se_users.user_username,
se_users.user_fname,
se_users.user_lname,
se_users.user_photo,
(SELECT user_id FROM se_visitors WHERE visitor_user_id=se_users.user_id LIMIT 1) visit,
CASE
WHEN ((se_users.user_privacy & @SE_PRIVACY_REGISTERED) AND '1'<>0)
THEN FALSE
WHEN ((se_users.user_privacy & @SE_PRIVACY_ANONYMOUS) AND '1'=0)
THEN FALSE
WHEN ((se_users.user_privacy & @SE_PRIVACY_SELF) AND se_users.user_id='44')
THEN FALSE
WHEN ((se_users.user_privacy & @SE_PRIVACY_FRIEND) AND (SELECT TRUE FROM se_friends WHERE friend_user_id1=se_users.user_id AND friend_user_id2='44' AND friend_status='1' LIMIT 1))
THEN FALSE
WHEN ((se_users.user_privacy & @SE_PRIVACY_SUBNET) AND se_users.user_subnet_id='0')
THEN FALSE
WHEN ((se_users.user_privacy & @SE_PRIVACY_FRIEND2) AND se_users.user_subnet_id='0' AND (SELECT TRUE FROM se_friends AS friends_primary LEFT JOIN se_friends AS friends_secondary ON friends_primary.friend_user_id2=friends_secondary.friend_user_id1 WHERE friends_primary.friend_user_id1=se_users.user_id AND friends_secondary.friend_user_id2='44' LIMIT 1))
THEN FALSE
ELSE TRUE
END
AS is_profile_private
FROM
`se_profilecomments`
LEFT JOIN
se_users
ON
`se_profilecomments`.`profilecomment_authoruser_id`=se_users.user_id
WHERE
`profilecomment_user_id`='263'
ORDER BY
`profilecomment_id` DESC
LIMIT
0, 5;
Далее открываем phpmyadmin вставляем данный запрос на исполнение и смотрим
1. что он выводит
2. время исполнения
Пробуем убрать (для информации вложения), скажем
PHP:
,
(SELECT user_id FROM se_visitors WHERE visitor_user_id=se_users.user_id LIMIT 1) visit,
CASE
WHEN ((se_users.user_privacy & @SE_PRIVACY_REGISTERED) AND '1'<>0)
THEN FALSE
WHEN ((se_users.user_privacy & @SE_PRIVACY_ANONYMOUS) AND '1'=0)
THEN FALSE
WHEN ((se_users.user_privacy & @SE_PRIVACY_SELF) AND se_users.user_id='44')
THEN FALSE
WHEN ((se_users.user_privacy & @SE_PRIVACY_FRIEND) AND (SELECT TRUE FROM se_friends WHERE friend_user_id1=se_users.user_id AND friend_user_id2='44' AND friend_status='1' LIMIT 1))
THEN FALSE
WHEN ((se_users.user_privacy & @SE_PRIVACY_SUBNET) AND se_users.user_subnet_id='0')
THEN FALSE
WHEN ((se_users.user_privacy & @SE_PRIVACY_FRIEND2) AND se_users.user_subnet_id='0' AND (SELECT TRUE FROM se_friends AS friends_primary LEFT JOIN se_friends AS friends_secondary ON friends_primary.friend_user_id2=friends_secondary.friend_user_id1 WHERE friends_primary.friend_user_id1=se_users.user_id AND friends_secondary.friend_user_id2='44' LIMIT 1))
THEN FALSE
ELSE TRUE
END
AS is_profile_private
опять смотрим время выполнения. и вывод.
Далее определяем данный запрос в каком он файле.
скажем этот запрос делает в файле: class_comment.php
После
// THIS METHOD RETURNS AN ARRAY CONTAINING COMMENT INFO
// INPUT: $start REPRESENTING THE COMMENT TO START WITH
// $limit REPRESENTING THE NUMBER OF COMMENTS TO RETURN
// OUTPUT: AN ARRAY OF COMMENTS
думаю общая идея для переписывания движка понятна. Кстати заметил, что не так уж и много, что надо делать для более-менее оптимизации всего этого добра что 3.20