什么表结构将提供更快的SQL查询结果

时间:2013-03-27 23:12:36

标签: mysql sql database performance optimization

我想创建一个表格,以反映用户对我的应用程序中其他用户的操作。

我想到了两个解决方案,我想知道什么会更快?

1)

ID | source_user_id | target_user_id | action_type

在此选项中,我将为每个操作创建一行

2)

Id | source_user_id | target_user_id | action_x | action_y | action_z

在此选项中,我将为其他用户可用的所有操作创建一行, 如果未执行操作,则字段将设置为NULL值 仅当至少执行了一个操作时才会创建此行

你能帮我理解为什么最好的选择

对不起我的英语不好。
谢谢

3 个答案:

答案 0 :(得分:1)

绝对不是第二名。我会选择修改后的第一名:

ID | source_user_id | target_user_id | **action_id**

然后制作一张表actions

ID | action_type | action_info | etc

这将允许您进行多个不同的操作,并且更加灵活。你说,“我将为其他用户提供的所有操作创建一行”......但是,根据您的布局,您真正想要的是为用户之间的每个操作创建另一个 。这是处理这个问题的一种非常糟糕的方式。

答案 1 :(得分:1)

什么会更快?

为了获得特定用户的所有操作,第二个解决方案应该更快,尽管这可能只是少量。

为了添加新动作,第一个解决方案要快得多。第二种解决方案需要重新组织表格。

接下来,您没有说明您要为第二种情况添加到列中的内容。如果你输入长度为2,000个字符的字符串,那么第一种情况可能要快得多,尤其是hellohellosharp建议使用id而不是值。较短的记录和减少的I / O应该弥补必须将大表连接到一个小的参考表。

因为您没有提供足够的信息来实际回答有关性能的问题,所以最好的答案是专注于数据库设计。为此,操作表应该具有自动递增ID,两个用户ID,操作ID以及发生时间的日期/时间字段。使用适当的索引,获取有关特定用户或用户/操作的信息应该具有足够好的应用程序性能。

答案 2 :(得分:0)

在定义表格结构之前,您首先要确定哪些预期查询对性能至关重要? 是否为{{1}获取所有可用action s }和source ?或者获取系统中当前可用的target user?表格的构建方式可能会有很大的不同。

在此之后,您可以使用许多技术来构建针对您的需求进行优化的表格,例如:

  1. 将通常一起检索的数据单元嵌入同一个表中;
  2. 索引列;
  3. 其中许多更多,其中前两个是最基本的。