Я уже давно борюсь с этой проблемой, и автоматические письма с предупреждениями 'Slow Query' все еще появляются. В основном, у меня есть блоги с соответствующей таблицей, а также таблица, которая отслеживает много раз каждый блог был просмотрен. Эта последняя таблица содержит огромное количество записей, так как на этой странице достаточно высокий трафик, и каждый журнал регистрируется как отдельная строка. Я пытался с индексами на полях, которые включены в предложение WHERE, но это, похоже, не помогает. Я также пытался чистить таблицу каждую неделю, удаляя старые (> 1.weeks) записи. Итак, я спрашиваю вас, ребята, как бы вы решили это?
Я знаю, что запрос вызывает медлительность, генерируется Rails и выглядит так:
SELECT count(*) AS count_all
FROM blog_views
WHERE (created_at >= '2010-01-01 00:00:01' AND blog_id = 1);
Таблицы имеют следующую структуру:
CREATE TABLE IF NOT EXISTS 'blogs' (
'id' int(11) NOT NULL auto_increment,
'name' varchar(255) default NULL,
'perma_name' varchar(255) default NULL,
'author_id' int(11) default NULL,
'created_at' datetime default NULL,
'updated_at' datetime default NULL,`
'blog_picture_id' int(11) default NULL,
'blog_picture2_id' int(11) default NULL,
'page_id' int(11) default NULL,
'blog_picture3_id' int(11) default NULL,
'active' tinyint(1) default '1',
PRIMARY KEY ('id'),
KEY 'index_blogs_on_author_id' ('author_id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
И
CREATE TABLE IF NOT EXISTS 'blog_views' (
'id' int(11) NOT NULL auto_increment,
'blog_id' int(11) default NULL,
'ip' varchar(255) default NULL,
'created_at' datetime default NULL,
'updated_at' datetime default NULL,
PRIMARY KEY ('id'),
KEY 'index_blog_views_on_blog_id' ('blog_id'),
KEY 'created_at' ('created_at')
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;