Grapefruit Lips
Новичок
проблема с индексами
Здравствуйте,
помогите разобраться с индексами в таблицах, думаю что дело именно в них.
стоит memcached, но нагрузка на mysql на сервере постоянно в пределах от 60 до 80-90%.
размер базы около 90MB
таблиц около 10, но в данном случае важны 2, это users и posts:
[SQL]
CREATE TABLE `posts` (
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) NOT NULL default '0',
`date` datetime NOT NULL default '0000-00-00 00:00:00',
`type` varchar(10) NOT NULL,
`notes` int(11) NOT NULL default '0',
`title` text NOT NULL,
`photo` text NOT NULL,
`photourl` text NOT NULL,
`link` text NOT NULL,
`linkname` text NOT NULL,
`quote` text NOT NULL,
`quotesource` text NOT NULL,
`audio` text NOT NULL,
`video` text NOT NULL,
`post` text NOT NULL,
`ban` int(1) NOT NULL default '0',
UNIQUE KEY `id` (`id`),
KEY `uiddy` (`user_id`),
KEY `typ` (`type`(4)),
KEY `notes` (`notes`),
KEY `ban` (`ban`),
KEY `photo` (`photo`(5)),
KEY `date` (`date`),
FULLTEXT KEY `post` (`post`),
FULLTEXT KEY `quote` (`quote`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=152390 ;
[/SQL]
[SQL]
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`site` varchar(32) NOT NULL,
`email` varchar(100) NOT NULL,
`password` varchar(50) NOT NULL,
`btitle` varchar(255) NOT NULL,
`about` text NOT NULL,
`logo` int(1) NOT NULL default '0',
`avatar` varchar(50) NOT NULL,
`avatar_id` int(11) NOT NULL default '0',
`postslimit` int(11) NOT NULL default '10',
`joindate` datetime NOT NULL default '0000-00-00 00:00:00',
`lastupdate` datetime NOT NULL default '0000-00-00 00:00:00',
`ip` varchar(50) NOT NULL,
`banned` int(1) NOT NULL default '0',
UNIQUE KEY `id` (`id`),
KEY `sity` (`site`(8)),
KEY `lastupdate` (`lastupdate`),
KEY `avbn` (`avatar`(4),`banned`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3027 ;
[/SQL]
на сайте выводятся посты пользователей
(т.е. выводятся посты тех, за которыми *следит* пользователь)
# Query_time: 12 Lock_time: 0 Rows_sent: 56897 Rows_examined: 304497
[SQL]
SELECT posts.id AS postid, title, date, type, totalnotes, photo, photourl, link, linkname, quote, quotesource, audio, video, post, users.id AS follower_id, users.site AS site, users.avatar AS ava, users.avatar_id AS ava_id
FROM posts
LEFT JOIN users ON posts.user_id=users.id
WHERE posts.id<151609 AND user_id IN(834,840,843,865,866,906,908,911,915,...........)
OR user_id='14' AND posts.id<151609
GROUP BY posts.id
ORDER BY posts.date DESC;
[/SQL]
то что в IN() - это ID пользователей, за которыми человек следит (они отдельным запросом, также через memcache хранятся в переменной какое-то время)
14 - это ID самого пользователя, чтобы было видно и свои посты.
или вот такой запрос:
# Query_time: 11 Lock_time: 0 Rows_sent: 11781 Rows_examined: 60600
[SQL]
SELECT posts.id AS iddy, user_id, notes, date, users.site AS website, users.btitle AS btitle, photo FROM posts
LEFT JOIN users ON posts.user_id=users.id
WHERE photo!='' AND ban='0' AND notes>1
GROUP BY posts.id ORDER BY date DESC;
[/SQL]
помогите правильно раставить индексы, если дело в них?
или нужно ещё оптимизировать запрос?
спасибо
Здравствуйте,
помогите разобраться с индексами в таблицах, думаю что дело именно в них.
стоит memcached, но нагрузка на mysql на сервере постоянно в пределах от 60 до 80-90%.
размер базы около 90MB
таблиц около 10, но в данном случае важны 2, это users и posts:
[SQL]
CREATE TABLE `posts` (
`id` int(11) NOT NULL auto_increment,
`user_id` int(11) NOT NULL default '0',
`date` datetime NOT NULL default '0000-00-00 00:00:00',
`type` varchar(10) NOT NULL,
`notes` int(11) NOT NULL default '0',
`title` text NOT NULL,
`photo` text NOT NULL,
`photourl` text NOT NULL,
`link` text NOT NULL,
`linkname` text NOT NULL,
`quote` text NOT NULL,
`quotesource` text NOT NULL,
`audio` text NOT NULL,
`video` text NOT NULL,
`post` text NOT NULL,
`ban` int(1) NOT NULL default '0',
UNIQUE KEY `id` (`id`),
KEY `uiddy` (`user_id`),
KEY `typ` (`type`(4)),
KEY `notes` (`notes`),
KEY `ban` (`ban`),
KEY `photo` (`photo`(5)),
KEY `date` (`date`),
FULLTEXT KEY `post` (`post`),
FULLTEXT KEY `quote` (`quote`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=152390 ;
[/SQL]
[SQL]
CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`site` varchar(32) NOT NULL,
`email` varchar(100) NOT NULL,
`password` varchar(50) NOT NULL,
`btitle` varchar(255) NOT NULL,
`about` text NOT NULL,
`logo` int(1) NOT NULL default '0',
`avatar` varchar(50) NOT NULL,
`avatar_id` int(11) NOT NULL default '0',
`postslimit` int(11) NOT NULL default '10',
`joindate` datetime NOT NULL default '0000-00-00 00:00:00',
`lastupdate` datetime NOT NULL default '0000-00-00 00:00:00',
`ip` varchar(50) NOT NULL,
`banned` int(1) NOT NULL default '0',
UNIQUE KEY `id` (`id`),
KEY `sity` (`site`(8)),
KEY `lastupdate` (`lastupdate`),
KEY `avbn` (`avatar`(4),`banned`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3027 ;
[/SQL]
на сайте выводятся посты пользователей
(т.е. выводятся посты тех, за которыми *следит* пользователь)
# Query_time: 12 Lock_time: 0 Rows_sent: 56897 Rows_examined: 304497
[SQL]
SELECT posts.id AS postid, title, date, type, totalnotes, photo, photourl, link, linkname, quote, quotesource, audio, video, post, users.id AS follower_id, users.site AS site, users.avatar AS ava, users.avatar_id AS ava_id
FROM posts
LEFT JOIN users ON posts.user_id=users.id
WHERE posts.id<151609 AND user_id IN(834,840,843,865,866,906,908,911,915,...........)
OR user_id='14' AND posts.id<151609
GROUP BY posts.id
ORDER BY posts.date DESC;
[/SQL]
то что в IN() - это ID пользователей, за которыми человек следит (они отдельным запросом, также через memcache хранятся в переменной какое-то время)
14 - это ID самого пользователя, чтобы было видно и свои посты.
или вот такой запрос:
# Query_time: 11 Lock_time: 0 Rows_sent: 11781 Rows_examined: 60600
[SQL]
SELECT posts.id AS iddy, user_id, notes, date, users.site AS website, users.btitle AS btitle, photo FROM posts
LEFT JOIN users ON posts.user_id=users.id
WHERE photo!='' AND ban='0' AND notes>1
GROUP BY posts.id ORDER BY date DESC;
[/SQL]
помогите правильно раставить индексы, если дело в них?
или нужно ещё оптимизировать запрос?
спасибо