DATABASE优化插入和搜索

时间:2014-01-14 01:16:10

标签: mysql optimization query-optimization

我和我的一个朋友争吵了。假设我们有一个带有userid和其他字段的db表。此表可能包含很多行。让我们假设通过设计我们将表中每个用户ID的记录限制为大约50.我的朋友建议如果我在每个用户ID的每一行下一个接一个地查找会更快,例如

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

等。因此,当创建用户id 1时,我将50个表的行预先填充为空值...等。我的想法是,如果我知道行数并找到userid = 1的第一行,我只需要查看下一个49,我不必搜索整个表。这是正确的吗?这可以在没有索引的情况下完成吗?预先填充是一个昂贵的过程吗?如果我只是以像

这样的老式方式插入,是否存在性能差异
1 ........
2 ........
2 ........
1 ........

等?

1 个答案:

答案 0 :(得分:0)

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

但是,让我提几点。

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

其次,如果数据是固定长度(数字和日期),则在用NULL值填充后用值填充它将占用页面上的相同空间。但是,如果数据是可变长度的,那么给定页面将填充空记录。使用实际值修改记录时,将进行页面拆分。

您要做的是超越数据库引擎。这不是必需的,因为MySQL提供的索引几乎可以提供您所描述的所有好处。

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