首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于DB结构的帮助,vOD站点

关于DB结构的帮助,vOD站点
EN

Software Engineering用户
提问于 2012-08-21 10:05:36
回答 3查看 318关注 0票数 1

我有一个视频点播风格的网站,在不同的模块下托管系列视频。然而,以我设计数据库的方式,它被证明是非常缓慢的。我以前问过这个问题,有人建议建立索引,但我似乎无法理解它。但我希望有人在这里帮助数据库的结构,看看它是否可以改进。核心表是视频:

代码语言:javascript
复制
ID       bigint(20) (primary key, auto-increment)
pID      text   
airdate  text   
title    text   
subject  mediumtext
url      mediumtext
mID      int(11)
vID      int(11)    
sID      int(11)

pID是每个视频的唯一5位字符串,它是一个速记标识符。Airdate是TS,(以文本格式存储,也许我应该将其更改为时间戳自动更新),标题是自我解释的,主题是自我解释的,url是站点上到视频的硬链接,mID是连接到另一个表的模块标题,vID是连接到另一个表中的视频语言,(英语,俄语等),sID是模块的摘要,是存储在外部数据库中的段落。

网站中最慢的部分是日志记录部分。我将数据存储在另一个名为“Hits”的表中:

代码语言:javascript
复制
id      mediumint(10)   (primary key, auto-increment)
progID  text
ts      int(10)

同样,这里(这都是一段时间前做的),但我的时间戳(ts)是一个INT,而不是在更新当前时间戳,我想应该是。然而,这个表现在有47,492行长,我为处理它而编写的脚本非常慢,实际上它超时了。每次用户单击网站上的“Play”时,都会向该表添加一行,因此progID与pID相同,并在ts中记录php ()时间戳。

基本上,我将“hits”的整个数据库加载到一个数组中,并使用TS列计算每天的点击量。我猜(我在所有这些事情上都很慢,但我不知道当我建造这个东西的时候会发生这种事),这可能是最糟糕的方式。

因此,我的问题如下:

  1. 有没有更好的方法来构造‘视频’表,是吗,你有什么建议?
  2. 有没有更好的方法来构造‘点击’,如果是,请帮助/告诉我!

或者是因为我的表很好,而PHP编码很糟糕呢?

EN

回答 3

Software Engineering用户

发布于 2012-08-21 12:14:53

基本上,我将“hits”的整个数据库加载到一个数组中,并使用TS列计算每天的点击量。

你想要速度,去正常化。这是一个罕见的情况下,非正常化是好的。要让你的网站慢一点,哪怕是一些小的东西,比如点击计数器,都是疯狂的。

因此,创建一个这样的表:

代码语言:javascript
复制
Video bigint(20) 
Date (Date Only)
HitCounter int

每次您有一个点击更新这个表,添加一个到HitCounter。(在一天中的第一次重击中插入一个新记录)。现在,你可以随时得到你的计数。

注意:每当你像这样去正常化,确保你有一个例程,可以修复你的汇总表中的数据。这个例行公事应该定期进行。

正如其他人指出的那样,由于你的数据如此之少,我同意他们的看法,怀疑计数器是造成您的性能问题的原因。上面的解决方案很可能与YouTube所做的计数类似。

票数 1
EN

Software Engineering用户

发布于 2012-08-21 14:01:35

  1. 当您的ID中已经有一个唯一的整数标识符时,为什么您有一个字符串pID?声明为主键的ID列可能已经索引,整数比较比字符串比较快得多。为什么不能直接使用ID而不是pID everywhere并删除pID列呢?
  2. 我认为上面的第一条是一个小错误。你有没有给你的应用程序计时,以证明你自己正处于缓慢状态呢?除非你完全确定什么是慢的,否则你是在浪费你的时间来加速错误的事情。

在Java中,我使用:

代码语言:javascript
复制
long startMs = System.currentTimeMs();
logger.info("Time before doing first thing: " + System.currentTimeMs() - startMs);
// do first thing.
logger.info("Time before doing second thing: " + System.currentTimeMs() - startMs);
// do second thing.
logger.info("Time after doing second thing: " + System.currentTimeMs() - startMs);
// etc.
logger.info("Total time: " + System.currentTimeMs() - startMs);

运行程序的慢部分至少5次,可能10次,以确保您的测试系统没有忙着做其他的事情和抛出您的时间。写下你的时间表,特别是什么是慢的,准确地说是多慢,以及总时间。你不想通过放慢另一部分的速度来加快一个部分的速度,而实际上你会使整个过程变慢。

票数 0
EN

Software Engineering用户

发布于 2012-09-29 21:41:18

我能看到一些你应该看的东西。

pID是用来干什么的?如果它只是链接两个表,一个int将更快,并简化视频表。

您说得对,应该将AirDate存储为时间戳/日期时间字段,只要有可能,就将文本字段保持在所需的最低限度。我甚至会考虑将标题subject (&一个新的描述字段)移到一个单独的表中(这样可以使主视频表尽可能小、更快):

代码语言:javascript
复制
ID bigint (same as videos.ID field)
title mediumtext
subject mediumtext
description mediumtext

对于hits表,我会按照@呆子建议的那样做,可能还会增加一个表来单独记录每个游戏(如果这很重要的话):

代码语言:javascript
复制
ID bigint (same as videos.ID field)
playedat timestamp/datetime
playedby int (if userid is known) / text (IP address if videos can be played anonymously)

@低能儿的建议会给出最大的提速。作为一项基本规则,只要有可能,将尽可能多的数据逻辑推送到DB服务器上,这就是它们的设计目的,而且它们非常擅长(快速),也尽量减少您访问DB的次数和通过网络传输回的信息量。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/161699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档