【问题标题】:what table structure will give faster sql query results什么表结构会给出更快的 sql 查询结果
【发布时间】:2013-03-27 23:12:35
【问题描述】:

我想制作一个表格,将用户的操作反映给我的应用程序中的另一个用户。

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

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 值 仅当至少执行了一项操作时才会创建此行

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

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

【问题讨论】:

  • 主要问题是你不知道如何自己衡量这个。我不知道 mysql,但我可以想象很多方法来进行性能测试。一种可能且简单的解决方案是询问谷歌。但是,从我的角度来看:#2 更快,因为它避免了JOIN。但这是设计表结构的一种非常愚蠢的方式,因为据我所知,它违反了 3ND。
  • 主要问题是牺牲正确性来换取性能。速度杀人。对速度的需求更加致命。

标签: mysql sql database performance optimization


【解决方案1】:

为什么会更快?

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

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

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

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

【讨论】:

  • 你解释了所有可能的情况,我担心从我的用户表中选择和加入,因为这会发生更多,我将在 action_x、action_y、action_z 中添加一个日期
【解决方案2】:

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

ID | source_user_id | target_user_id | **action_id**

那就做个表actions

ID | action_type | action_info | etc

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

【讨论】:

    【解决方案3】:

    在定义您的表结构之前,您首先必须确定哪些预期查询对性能至关重要? 是否source 和@987654323 获取所有可用的actions @?还是了解您的系统中当前有多少action_types 可用?表的构建方式可能会因此而大不相同。

    确定后,您可以使用多种技术来构建针对您的需求进行优化的表,例如:

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

    【讨论】:

    • 我的主要操作是获取我在搜索用户时对其他用户执行的操作,并列出我对其执行的操作的用户。
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多