[英]Suggestion on Database structure for relational data
我已经为这个问题努力了很长时间,并且仍然弹出带有“慢查询”警告的自动邮件。基本上,我的Blog带有一个对应的表以及一个跟踪每个表有多少次的表博客已被查看。 由于该页面的访问量相对较高,所以最后一个表具有大量记录,并且将每个匹配记录为单独的行。 我已尝试使用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 ;
最有可能的是,您在Blog_id和created_at列上都需要一个索引
不是两个索引各占一列...
...
KEY 'whizzy' ('blog_id', 'created_at'),
...
在CREATE TABLE中,您可以具有复合索引/键:
...
{INDEX|KEY} [index_name] [index_type] (index_col_name,...)
...
如果无效,请尝试将订单撤消
我不会将每个匹配记录为唯一的一行。
如果您只想统计浏览一个博客的次数,为什么不为每个博客创建一行,然后将view_count字段添加到表中。 然后仅此字段将被更新...。
如果需要跟踪用户/ ips,并且想知道每个用户单击博客的次数,则可以在类似于此的结构中创建一个额外的表:
id(pk)
blog_id
user_id / ip_address
日期
hit_counts
通过这样的结构,您可以概览浏览博客的次数,以及查看多少用户以及每个用户单击了多少次...
否则,如果您确实想为每个匹配项创建行,而索引却没有足够快地完成该过程,则可以考虑使用功能更强大的服务器或其他数据库管理系统。
希望这可以帮助!
我的想法与皮耶罗相同,但有所不同。
您可以在名为“命中”的博客表中添加一列,并在发生命中时始终增加此字段的值,并像现在一样在blog_view表中插入新记录。
这样,您就不必运行查询来对点击进行计数,您还可以在需要时查看点击详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.