【问题标题】:DATABASE optimization insert and search数据库优化插入和搜索
【发布时间】:2014-02-01 23:25:33
【问题描述】:

我和我的一个朋友发生了争执。假设我们有一个带有用户 ID 和其他一些字段的数据库表。该表可能有很多行。我们还假设通过设计我们将表中每个用户 ID 的记录限制为大约 50 条。我的朋友建议如果我在每个用户 ID 的每一行下一个接一个地查找会更快,例如

userid otherfield
1      .........
1      .........
.....until 50...
2       ........

等等。因此,当创建用户 id 1 时,我将 50 个表的行预填充为空值……等等。这个想法是,如果我知道行数并找到用户 ID = 1 的第一行,我只需查看下一个 49 行,瞧,我不必搜索整个表。这是正确的吗?可以在没有索引的情况下完成吗?预填充是一个昂贵的过程吗?如果我只是以老式方式插入,是否会有性能差异

1 ........
2 ........
2 ........
1 ........

等等?

【问题讨论】:

  • 很难准确理解您的提议,但从我收集到的信息来看,这听起来是个坏主意。不要试图用这样一个过于复杂的解决方案来智取 MySQL。只有痛苦会来自它。你能展示你的表结构和建议的查询吗?

标签: mysql optimization query-optimization


【解决方案1】:

要回答这样的性能问题,您应该在不同的配置上运行性能测试。

但是,让我提出几点。

首先,虽然您可能知道给定 id 的记录彼此相邻,但数据库并不知道这一点。因此,如果您正在搜索一个用户(没有索引),那么引擎需要搜索所有记录(除非您在查询中有 limit 子句)。

其次,如果数据是固定长度(数字和日期),则在填充NULL 值后填充值将占用页面上相同的空间。但是,如果数据是可变长度的,那么给定的页面将被空记录填充。当你用真实值修改记录时,你会得到分页。

您想要做的是智取数据库引擎。这不是必需的,因为 MySQL 提供了索引,它提供了您所描述的几乎所有好处。

现在,话虽如此, 将用户的所有记录放在同一位置会带来一些性能优势。如果用户有 50 条记录,那么使用索引读取记录通常需要将 50 页加载到内存中。如果记录位于同一位置,则只需要读取一到两条记录。通常,这将是一个非常小的性能提升,因为最常访问的表适合内存。在某些情况下,性能提升是值得的。

【讨论】:

  • 如果我想预填充 1000 行怎么办。搜索时会不会有性能提升?通过访问表,你的意思是当你在数据库中搜索时,整个表将正确加载到内存中?
  • @Apostolos 。 . . 1000 行对性能的影响很小,因为所有数据都可以轻松放入内存中。甚至不值得尝试。
猜你喜欢
  • 2018-06-11
  • 2019-06-25
  • 2015-03-25
  • 2023-04-10
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-05
相关资源
最近更新 更多