1

我正在寻找一些关于可以处理大量数据的多语言 MySQL 数据库结构的建议。我们目前正在使用以下方法:

Articles  <- Article_translations -> Languages
id           id                      id
date         language_id (fk)        locale
category     article_id  (fk)   
             content

好的,可以说我们有 100.000 篇文章和 5 种语言......嗯..你看到了问题。数据越大,数据库越慢(这里只是一个猜测,但是绝对必要的复杂 JOIN 查询可能不是 O(log(n)),而是 O(n^2))。

我们当前的解决方案是将 Article_translations 拆分为 [locale]_article_translations(例如 en_us_article_translation),在这种情况下,我们需要轻松地同步这些表之间的结构。这是解决这个问题的合适方法还是有更好的方法?如果这是一个好的解决方案,是否有一些东西可以帮助监控变化(只有结构,没有数据同步!)并同步这些结构?

4

2 回答 2

1

你说对了一半,较大的数据会使数据库变慢,但是如果数据库没有良好的设计,即使数据很小,它也会很慢。

我不能告诉你什么是最好的方法或最好的解决方案,记住你需要做很多事情才能找到“最好的解决方案”。我只能向您推荐一些可以帮助您的工具和技巧。

首先,检查你的索引,索引类型,不只是PK和FK,你还需要看看你需要哪种类型的索引,IE,你需要文本索引吗?或哈希树???。

还要检查您的引擎、MyISAM 还是 InnoDB?。您说您拆分了表格,请查看有关拆分的帖子

此外,如果您避免某些事情,您的查询会更快,请like '%word%'记住,错误的查询会对响应时间产生巨大影响。

您可以使用Show create tableor D escribe select ......orexplain查看发生了什么,或使用命令benchmark查看您正在应用的函数的大致时间来改进它

MySQL 的一些工具我建议你看看这个程序,它将帮助你提高这部分性能。

  • Mysqlslap(它就像基准,但您可以自定义更多结果)。

  • SysBench(测试 CPU 性能、I/O 性能、互斥争用、内存速度、数据库性能)。

  • Mysqltuner(您可以使用它分析一般统计信息、存储引擎统计信息、性能指标)。

  • mk-query-profiler(执行 SQL 语句分析)。

  • mysqldumpslow(很高兴知道女巫查询会导致问题)。

于 2012-07-09T20:00:12.477 回答
0

假设您是否正确调整查询

  • 使用大量数据检查查询执行计划
  • 确保您是否将数据库级别参数用作“大型集”而不是行级别
  • 看看你是否让你的表非规范化(反之亦然)足够。

尽管我不确定您使用的是哪个版本的 MySQL,但我建议如下

  • 在数据库级别分区
  • 数据库服务器中的快速硬盘

我建议先使用分区,然后您可能会考虑升级硬盘。

分区

分区是数据库级别提供的数据拆分。根据您的查询使用情况,您可以划分数据,例如,在您的案例中按语言划分。使用 DB 分区的好处是

  • 它可以由应用程序端的单个表处理
  • 取决于数据量和频率,可以按数据库级别重新排列。对应用程序没有影响。

硬盘质量

此外,硬盘质量对于处理大量数据也很重要。即使查询被优化,如果您在单个查询中处理大量数据,您需要快速数据访问。但这很昂贵。

于 2012-07-09T20:14:16.953 回答