Требуется оптимизация SQL запроса

Решил добавить для форумов своих удобную штуку как список всех комментариев, но столкнулся с проблемой (кеш у меня выключен, но дело не в этом). У меня на форуме 3.233.031 комментариев и запрос как в comment.mapper.class.php в функции GetCommentsAll капитально тормозит машину :
$sql = "SELECT
					c_fast.*,
					c_full.*,
					u.user_profile_avatar as user_profile_avatar,
					u.user_profile_avatar_type as user_profile_avatar_type,
					u.user_login as user_login,
					u.user_login_confirm as user_login_confirm,
					b.blog_title as blog_title,
					b.blog_type as blog_type,
					b.blog_url as blog_url,
					u_owner.user_login	as blog_owner_login
				FROM (
					SELECT 					
						c.comment_id,
						t.topic_title as topic_title,
						t.topic_count_comment as topic_count_comment,
						t.topic_url as topic_url,
						t.blog_id									
					FROM 
						".DB_TABLE_FTOPIC_COMMENT." as c,
						".DB_TABLE_FTOPIC." as t					 
					WHERE 					
						c.comment_delete = 0
						AND			
						c.topic_id=t.topic_id
						AND
						t.topic_publish = 1					
					ORDER by c.comment_id desc
					LIMIT ?d, ?d
					) AS c_fast
					JOIN ".DB_TABLE_FTOPIC_COMMENT." AS c_full ON c_fast.comment_id=c_full.comment_id
					JOIN ".DB_TABLE_USER." AS u ON c_full.user_id=u.user_id
					JOIN ".DB_TABLE_FBLOG." AS b ON c_fast.blog_id=b.blog_id
					JOIN ".DB_TABLE_USER." AS u_owner ON b.user_owner_id=u_owner.user_id
										
					";

выполняется 27 секунд… вся машина висит. включение кеша особо ситуацию не исправит, так как комментарии каждую минуту добавляются…

Давайте подумаем, как можно еще оптимизировать запрос, может стоит что-то убрать/добавить?

2 комментария

avatar

посмотри сколько выполняется вложенный запрос с разными лимитами:
SELECT                                
                                                c.comment_id,
                                                t.topic_title as topic_title,
                                                t.topic_count_comment as topic_count_comment,
                                                t.topic_url as topic_url,
                                                t.blog_id                                                                      
                                        FROM
                                                ".DB_TABLE_FTOPIC_COMMENT." as c,
                                                ".DB_TABLE_FTOPIC." as t                                        
                                        WHERE                                  
                                                c.comment_delete = 0
                                                AND                    
                                                c.topic_id=t.topic_id
                                                AND
                                                t.topic_publish = 1                                    
                                        ORDER by c.comment_id desc
                                        LIMIT ?d, ?d
здесь скорее всего придётся делать пагинацию через интервалы айдишников комментов, т.е. where comment_id>1000 and comment_id<1050, или что то подобное
  • ort
  • 0
avatar
мммм, честно говоря не понял ничего,
у меня сейчас интервал 50 комментариев на страницу, уменьшать не имеет смысла, ты имеешь ввиду вместо LIMIT?d,?d прописывать условие comment_id>1000 and comment_id<1050?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.