2012-06-07 37 views
3

首先,我不是数据库专家,而是承包商。我聘请了一位(优秀)程序员,但由于我们遇到的一些问题以及我正在阅读的所有信息,现在对数据库设计的某个部分有些怀疑。开始吧。使用blob与否,性能问题

我们建立了一个房屋网站,它使用解析器来处理所有数据并将其存储在ms-sql数据库中。每天饲料中都包含大约70,000条记录,其中大部分都附有照片(平均3张)。图片大小从30kb到400kb不等。 该数据库具有大约相同数量的记录。大约有400个新对象需要处理。这意味着每天都必须输入数据库中的所有记录,以查看数据是否已更改,对象是否已被删除,或者是否为新对象,因此必须插入。 图片存储在数据库中。这些订阅源在具有32GB内存和SSA磁盘的双核四核机器上进行处理。该数据库现在大小为600GB。

目前,我们每天约有3000位用户查看6个房屋,平均每个用户查看10个图像。

这就是我们所遇到的: - 整个解析过程大约需要13个小时。 - 我们在日志中发现了很多超时错误 - 我们得到了一些死锁错误 - Google抱怨超时错误,结果索引的页面不多。 - 由于某些目录的加载时间超过10秒,Google对该网站的评分较慢。

我个人认为它与数据库中的图片和一些不好的查询有关。但在我开始向我的程序员抱怨之前,我想听听你对此的看法。 预先感谢您的时间。

来自我的程序员的更新: 以下是关于表格结构的一些信息。有2个图像表,一个叫做imageinfo,用于在图像上进行查询(例如获取imageid和content-type的列表)以及一个包含图像id和BLOB的图像表。 imageinfo表具有与图像表(1:1关系)相同的id,并且具有一些额外的信息,例如图像的名称,类型和散列。该分析程序使用该散列来确定图像是否已更改。因此,触摸图像表的唯一时间是从解析器插入/更新/删除并且站点访问图像的时间。 访问和下载一个图像所需的时间约为350毫秒。

+1

无论什么执行速度都很慢......通常我不会使用blob并将文件/图像托管在单独的服务器上。数据库然后只是保存图片的位置。减少数据库大小,并减少一个服务器上的一切负担,即s3存储为您的图片 –

回答

2

您告诉我们两个问题:

  1. 导入缓慢
  2. 浏览该网站是缓慢

(2)很简单:你可能需要了解您的读取查询和索引他们。这绝对是可以解决的。

(1)如果没有更具体的说明,就更难说了。我知道你需要比较大量的斑点 - 除了实际数据之外,您可以存储这些博客的精简散列。这样您就不需要为了比较目的而检索blob,甚至可以对散列进行索引。

你应该在数据库中有图像吗?

最大的优点是:一致和简单的备份,开发人员的方便。最大的con是潜在的滥用。一般来说,你不能说图像属于文件系统。数据库通常对他们来说很好,除非有具体和具体的原因将它们放在别的地方。

我的猜测是您误用这些博客的用法,如果这些文件存储在文件系统中,您也会遇到同样的问题。

+0

奥克,感谢这个答案,我会问他是否现在正在使用(索引基于读取查询和使用compact hash。 但是你不认为从图像数据库中获取图像是一个好的开始?还是将它们存储在数据库中会更好一些,因为必须每天都进行比较 查看问题是,会有更多的feed,所以更多的数据会在几个月内出现,恐怕有些事情会被卡住,整个网站会陷入瘫痪状态 – user1441871

+0

我编辑了关于博客存储的想法,我最大的建议是:查看您的查询和访问模式你可以找到(并证明)错误,优化它们,你会好起来的 – usr

0

你真的需要衡量性能伤害你的位置。不知道什么是缓慢的,你不能希望开始修复它。

但是,如果您正在寻找关于从何处开始测量的想法,那么我会说看看导入过程,并且看看它在RBAR样式中做了什么。 RBAR代表'Row By Agonizing Row',它恰当地描述了一次操作单行的过程,当时它们将更有效率地工作。

我会检查的另一件事是,你实际上没有检查每个图像的内容,以确保它没有改变。如果你正在对这些数据进行二进制比较,我可以想象它会非常缓慢。如果计算校验和并比较校验和,则

a)您可以计算SQL Server进程之外的校验和,最好是在另一个盒子上。
b)您将能够以更精益的过程检查更新的图像,特别是如果该校验和是合适索引上的INCLUDE列。

但是,正如所评论的那样,将图像存储在数据库中并不是最聪明的想法。

+0

请看更新的问题和更多的信息 – user1441871

+0

我有,但我说的仍然是我的想法。这是真的,我们需要更详尽的描述过程,以评论更多... –