piton
Новичок
очень медленая выборка по трем таблицам, помогите с оптимизацией
Запрос выборки популярных "эмоций" за неделю, струкрута таблиц ниже, запрос выполняется 2-3 секунды на двухпроцессорном зеоне с 2 гигами памяти.
таблица содержит текущий вес эмоции и ее наименование (10 записей)
[sql]
CREATE TABLE `blogs_reting_vid` (
`id` mediumint(8) NOT NULL auto_increment,
`name` varchar(20) NOT NULL default '',
`znak` double(6,2) NOT NULL default '0.00',
`pub` mediumint(1) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
[/sql]
таблица содержит список проголосовавших (~12000 записей)
[sql]
CREATE TABLE `blogs_reting` (
`id` mediumint(8) NOT NULL auto_increment,
`post_id` mediumint(8) NOT NULL default '0',
`who` mediumint(8) NOT NULL default '0',
`golos` mediumint(8) NOT NULL default '0',
`ves` double(6,2) NOT NULL default '0.00',
`datetime` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `post_id` (`post_id`)
) ENGINE=MyISAM;
[/sql]
таблица постов (~10000 записец)
[sql]
CREATE TABLE `blogs` (
`id` mediumint(8) NOT NULL auto_increment,
`user_id` mediumint(8) NOT NULL default '0',
`who` mediumint(8) NOT NULL default '0',
`datetime` datetime NOT NULL default '0000-00-00 00:00:00',
... `mp3` smallint(1) NOT NULL default '0',
`video` smallint(1) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `deleted` (`deleted`),
KEY `user_id_2` (`user_id`,`deleted`),
KEY `news` (`news`),
KEY `userpic` (`userpic`),
KEY `pub` (`pub`,`news`),
KEY `deleted_2` (`deleted`,`news`)
) ENGINE=MyISAM;
[/sql]
Сам запрос:
[sql]
SELECT t1.id, t1.name, count(t2.id) AS cnt
FROM `blogs_reting_vid` AS t1, blogs AS t3
LEFT JOIN `blogs_reting` AS t2 ON t2.golos = t1.id
WHERE t2.post_id = t3.id
AND DATE_ADD( NOW( ) , INTERVAL -7 DAY ) < t3.datetime
AND NOW( ) > t3.datetime
GROUP BY t1.id
ORDER BY cnt DESC;
[/sql]
EXPLAIN говорит
Запрос выборки популярных "эмоций" за неделю, струкрута таблиц ниже, запрос выполняется 2-3 секунды на двухпроцессорном зеоне с 2 гигами памяти.
таблица содержит текущий вес эмоции и ее наименование (10 записей)
[sql]
CREATE TABLE `blogs_reting_vid` (
`id` mediumint(8) NOT NULL auto_increment,
`name` varchar(20) NOT NULL default '',
`znak` double(6,2) NOT NULL default '0.00',
`pub` mediumint(1) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM;
[/sql]
таблица содержит список проголосовавших (~12000 записей)
[sql]
CREATE TABLE `blogs_reting` (
`id` mediumint(8) NOT NULL auto_increment,
`post_id` mediumint(8) NOT NULL default '0',
`who` mediumint(8) NOT NULL default '0',
`golos` mediumint(8) NOT NULL default '0',
`ves` double(6,2) NOT NULL default '0.00',
`datetime` datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `post_id` (`post_id`)
) ENGINE=MyISAM;
[/sql]
таблица постов (~10000 записец)
[sql]
CREATE TABLE `blogs` (
`id` mediumint(8) NOT NULL auto_increment,
`user_id` mediumint(8) NOT NULL default '0',
`who` mediumint(8) NOT NULL default '0',
`datetime` datetime NOT NULL default '0000-00-00 00:00:00',
... `mp3` smallint(1) NOT NULL default '0',
`video` smallint(1) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `deleted` (`deleted`),
KEY `user_id_2` (`user_id`,`deleted`),
KEY `news` (`news`),
KEY `userpic` (`userpic`),
KEY `pub` (`pub`,`news`),
KEY `deleted_2` (`deleted`,`news`)
) ENGINE=MyISAM;
[/sql]
Сам запрос:
[sql]
SELECT t1.id, t1.name, count(t2.id) AS cnt
FROM `blogs_reting_vid` AS t1, blogs AS t3
LEFT JOIN `blogs_reting` AS t2 ON t2.golos = t1.id
WHERE t2.post_id = t3.id
AND DATE_ADD( NOW( ) , INTERVAL -7 DAY ) < t3.datetime
AND NOW( ) > t3.datetime
GROUP BY t1.id
ORDER BY cnt DESC;
[/sql]
EXPLAIN говорит
Код:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t2 ALL post_id NULL NULL NULL 7323 Using temporary; Using filesort
1 SIMPLE t3 eq_ref PRIMARY PRIMARY 3 blog.t2.post_id 1 Using where
1 SIMPLE t1 eq_ref PRIMARY PRIMARY 3 blog.t2.golos 1