Как оптимизировать запрос mysql с помощью PHP?

Evgeny777

Новичок
Приветствую всех. Имеется такой запрос:

Код:
SELECT SQL_CALC_FOUND_ROWS tb1.ac_id,ac_user_id,action_text,action_time,action_type,obj_id
FROM`vii_news`tb1
WHERE tb1.ac_user_id
IN(

SELECT tb2.friend_id
FROM `vii_friends` tb2, `vii_news` tb1
WHERE user_id = '1'
AND tb1.action_type
IN ( 1, 2, 3 )
AND subscriptions !=2
)
ORtb1.ac_user_id
IN(

SELECT tb2.friend_id
FROM `vii_friends` tb2, `vii_news` tb1
WHERE user_id = '1'
AND tb1.action_type =11
AND subscriptions =2
)
ANDtb1.action_type
IN(1,2,3,11)
ORDER BY tb1.action_timeDESC
LIMIT0,20
Вот структура таблиц.

Код:
CREATE TABLE IF NOT EXISTS `vii_news` (
  `action_text` text NOT NULL,
  `action_time` varchar(50) NOT NULL,
  `ac_id` int(11) NOT NULL auto_increment,
  `ac_user_id` int(11) NOT NULL,
  `action_type` tinyint(11) NOT NULL,
  `obj_id` int(11) NOT NULL,
  `author_user_id` int(11) NOT NULL,
  `for_user_id` int(11) NOT NULL,
  `fasts_num` mediumint(11) NOT NULL,
  `title` varchar(50) NOT NULL,
  `photo` int(11) NOT NULL,
  `comments` int(11) NOT NULL,
  PRIMARY KEY  (`ac_id`),
  KEY `ac_user_id` (`ac_user_id`),
  KEY `action_type` (`action_type`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=13196 ;

CREATE TABLE IF NOT EXISTS `vii_friends` (
  `user_id` int(11) NOT NULL,
  `from_user_id` int(11) NOT NULL,
  `friend_id` int(11) NOT NULL,
  `friends_date` date NOT NULL,
  `for_user_id` int(11) NOT NULL,
  `subscriptions` int(11) NOT NULL,
  `did` int(11) NOT NULL,
  `dname` varchar(50) NOT NULL,
  `ddate` varchar(30) NOT NULL,
  `ddownload_name` varchar(50) NOT NULL,
  `duser_id` int(11) NOT NULL,
  `views` int(11) NOT NULL,
  `user_logged_mobile` tinyint(1) NOT NULL,
  KEY `user_id` (`user_id`),
  KEY `subscriptions` (`subscriptions`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Время запроса 13 секунд. EXPLAIN:

id - select_type - table - type - possible_key - skey - key_len - ref - rows - Extra
1 - PRIMARY - tb1 - ALL - action_type - NULL - NULL - NULL - 11597 - Using where; Using filesort
3 - DEPENDENT SUBQUERY - tb2 - ref - user_id,subscriptions - user_id - 4 - const - 293 - Using where
3 - DEPENDENT SUBQUERY - tb1 - ref - action_type - action_type - 1 - const - 1735 - Using where; Using index
2 - DEPENDENT SUBQUERY - tb2 - ref - user_id,subscriptions - user_id - 4 - const - 293 - Using where
2 - DEPENDENT SUBQUERY - tb1 - range - action_type - action_type - 1 - NULL - 2799 - Using where; Using index

Не могу понять ситуацию с ключом tb1 vii_news, ключ не определен.

Пытаюсь выдать почастям с помощью скрипта:

HTML:
page: function(){
            var type = $('#type').val();
            $('#wall_l_href_news').attr('onClick', '');
            if($('#loading_news').text() == 'Показать предыдущие новости'){
                textLoad('loading_news');
                $.post('/index.php?go=news&type='+type, {page: 1, page_cnt: page_cnt}, function(d){
                    if(d != 'no_news'){
                        $('#news').append(d);
                        $('#wall_l_href_news').attr('onClick', 'news.page(\''+type+'\')');
                        $('#loading_news').html('Показать предыдущие новости');
                        page_cnt++;
                    } else
                        $('#wall_l_href_news').hide();
                });
            }
    }
На стороне сервера соответственно указанный выше sql запрос. грузит неимоверно.
Помогите, плиз, оптимизировать.
 
Последнее редактирование:

Активист

Активист
Команда форума
У вас же в анализе написано - индексы не используются. Уберите вообще вложенные SQL. Упростите до простых SQL по индексам.
 
Сверху