2014-01-14 72 views
-1

我与我的一位朋友发生争执。假设我们有一个带有userid和其他字段的db表。该表可能有很多行。同样假设,通过设计,我们限制了表中的每个用户ID记录约50.My朋友建议,如果我陆续每一行对每个用户ID之一的,查询速度会更快如数据库优化插入和搜索

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

等。所以,当创建一个用户ID 1时,我将50个表的行预填充为空值...等。这个想法是,如果我知道行数并找到第一行userid = 1,我只需要看下49个瞧,我不必搜索整个表。这是正确的吗?这可以做到没有索引?前期人群是一个昂贵的过程吗?如果我只是以老式的方式插入,像

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

等是否有性能差异?

+0

很难理解你的建议,但从我能收集到的信息来看,这听起来像个坏主意。不要试图用这种过于复杂的解决方案来取代MySQL。只有痛苦会来自它。你可以显示你的表结构和建议的查询吗? – JohnFx

回答

0

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

但是,让我说说几点。

首先,尽管您可能知道给定ID的记录彼此相邻,但数据库并不知道这一点。因此,如果您正在搜索一个用户(没有索引),则引擎需要搜索所有记录(除非查询中有limit子句)。其次,如果数据的长度是固定的(数字和日期),那么在填充值为NULL之后使用值填充值将占用页面上的相同空间。但是,如果数据是可变长度的,那么给定的页面将被填充空记录。当您使用实际值修改记录时,您将获得页面拆分。

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

现在,说了这么多,某些用户的所有记录位于同一位置的某些性能受益。如果用户有50条记录,那么使用索引读取记录通常需要将50个页面加载到内存中。如果记录位于同一位置,则只需要读取一条或两条记录。通常,这将是一个非常小的性能增益,因为大多数访问表适合内存。在某些情况下,性能增益是值得的。

+0

如果我想预先填充1000行,如果搜索时性能会有所提高;通过访问表你的意思是,当你在一个数据库中搜索整个表将被正确地加载到内存中? – Apostolos

+0

@Apostolos。 。 。 1000行对性能影响最小,因为所有数据都可以很容易地放入内存中。这甚至不值得尝试。 –