你会如何规范/优化这个mysql数据库?

时间:2009-11-11 04:30:08

标签: sql mysql

我有一个分类广告网站,有很多类别。

当用户在网站上发布“广告”时,必须填写一些基本信息(姓名,城市,价格,标题,文字等)。此外,还取决于“类别” “用户选择插入广告,必须填写更多字段,例如:如果类别为”汽车“,那么”里程“”年份“也会出现。

现在我的搜索引擎将查询表格,以查找用户选择搜索的内容......

我的问题是,您如何将此数据库放在最有效和最快的位置?

我已经阅读了关于规范化的内容,但是并不太了解它...所以无论你解释什么,请尽可能地解释它。

由于

8 个答案:

答案 0 :(得分:2)

数据库规范化通常不会提高速度,它有助于消除冗余并提高一致性。

如果速度是目标,那么你实际上需要 de - 将事物标准化。复杂连接通常是大型数据库中的性能瓶颈,通过对表进行非规范化来减少连接数将提高性能。

答案 1 :(得分:1)

我从这里开始学习规范化:

http://en.wikipedia.org/wiki/Database_normalization

或在这里

http://databases.about.com/od/specificproducts/a/normalization.htm

或者对于完全不熟悉这些概念的人来说,这是一篇非常好的文章:

http://www.phlonx.com/resources/nf3/

但要具体回答您的问题,我们需要了解您当前的设计布局计划,并从那里我们可以向您展示如何规范化,并提出更好的问题以获得更好的答案。

答案 2 :(得分:0)

迈克尔·詹姆斯·埃尔南德斯(Michael James Hernandez)Database Design for Mere Mortals开始学习这本书的好书。

答案 3 :(得分:0)

有很多方法可以解决,这里有几个:

  1. 一个包含字段名称,值,类型,分钟,最大等的表...所以每一行都像英里,年份,品牌,型号,房间,故事。然后将类别映射到字段。

  2. 具有公共信息的单个表,然后是以xml,json或其他一些序列化格式存储的元数据列。使用这种技术,您可能需要使用像Lucene这样的东西来索引元数据以进行搜索。

答案 4 :(得分:0)

以下是我的观点1)正确使用索引来加速选择查询。 2)聚合导航器/查询重定向器:如果此类数据可用且适合于查询,则这种技术可自动将查询指向聚合数据.3)分区:分区在很多方面具有形状和形式。它至少将一个表分成几个表,通常基于表数据表示的时间4)并行化查询执行 - Sachin Chourasiya

答案 5 :(得分:0)

我不认为规范化是这里的问题,你可能最终会得到一个用户和一个类别表以及用于保存广告的表格(是的,我知道可能会有更多的表格)对于应用程序,但让我们不要复杂化。)

广告表是有趣的部分:你有两个半选择。

  • 1)一个表来保存它们:一个表包含所有类别所需的所有字段
    • 亲:易于设置
    • 亲:易于维护(只有一个表需要备份,更改等)
    • pro:非常简单的SQL,简化了前端开发
    • con:不能很好地扩展
    • con:浪费了一些空间,从长远来看会减慢数据库的速度(虽然取决于数据库和表结构)
  • 2)每个类别一张表
    • 专业:(1)
    • 更好地扩展
    • con:非常复杂的SQL
    • con:维持噩梦:而不是一张桌子你必须改变100秒

所以你看,选项(2)实际上不是一个选项,即使它更好地扩展。如果您计划大型系统,则可以通过按类别对表进行聚类来实现大致相同的效果。

我欠你一半的选择:如果你没有绑定mysql,postgresql可以提供一个有趣的选择:表继承。在pg中,您可以定义一个包含基本结构的表ads和一个包含cars的所有字段以及一些(特定于汽车的)附加字段的派生表ads。你可以用一个电子表,一个用于摄影器材,等等。您甚至可以更进一步创建不从vans但从convertibles继承的表adscars,从而创建表示前端对象层次结构的类别树。 那么你可能会问到(2)的区别是什么?简化了维护,ads表中的结构更改向下传播到所有派生表(而cars表中的更改只会像人们预期的那样修改cars, convertibles and vans。 对于sql也是如此:如果你select * from ads where title='foo',查询将返回ads和所有派生表(整个树)的记录,如果你从cars中选择只搜索该子树。你明白了。 还有更多,您的搜索引擎可以提取您的分类表的结构/元数据并从中创建搜索界面,因此您的搜索界面始终与数据结构等同步。

没有想到这到最后,我仍然不确定我是否会以这种方式构建一个系统,但它有一些东西。系统必须设计得很好,并且有很多明确的界限,但这可能是一件好事(tm)。


关于mysql和postgres的最后一句话。 pg是一个数据库,恕我直言,在大多数方面今天优于mysql,只是不那么有名。不,我不只是一个postgres fanboy,我是一个高级的mysql用户,我开始使用mysql与版本2.something,我介绍它超过10年前在我仍然工作的公司(并做了它默认数据库),今天我不允许任何新的开发我可以决定基于mysql。 原因很简单:mysql中的默认“存储引擎”是myisam,它快速而精简,并提供了许多功能..如果你使用它,你将在长期内丢失数据。恕我直言,你只能将它用于易失性数据,并且有更好的替代方案来运行缓存。如果你不得不依赖你的数据,myisam是一个NOGO。 多年来,我多次测试了Innodb,这是交易“存储引擎”的默认设置,我从未发现性能令人满意,所以我选择了替代方案。

postgres也不是完美的,但是在过去的几年中它在可用性,管理和速度方面都有了很大的改进(特别是它无论如何都是大部分时间都是领先的,现在仍然如此)。

好的,今天有足够的宣传,我现在就去睡觉了: - )

答案 6 :(得分:0)

我会将每个广告的基本信息放在同一个表中,并为每个类别提供一个包含扩展信息的单独表格。我认为这给了最干净的设计。您将能够为每个字段使用拟合数据库数据类型,它将很容易排序和过滤等。例如,这将为您提供以下表格:

广告

  • ID
  • 名称
  • 城市
  • 标题

汽车

  • ID
  • ad_id
  • 里程

唯一的缺点是您的查询将取决于类别。

另一个必然出现的选项是将字段及其值保存为“属性”表中的键值对。我强烈建议不要去'build-database-within-database'路线。迟早你会遇到问题。主要的痛点是,您必须为所有值提供相同的数据类型,这通常会变成VARCHAR。这意味着过滤和排序非文本值(即数字,日期/时间等)将变得非常麻烦。

答案 7 :(得分:0)

MongoDB专为这种情况而设计。