【问题标题】:mysql query speedmysql查询速度
【发布时间】:2009-07-31 22:05:33
【问题描述】:

我只是想问一下,这两种存储数据的方式中哪一种会得到更好的结果

A.将数据存储在超过 20 列的单个表中

B.将数据分布到两个表中,每个表有 15 列和 6 列

还有一件事,即使我分发数据,在 60% 的情况下,我仍然可能需要同时访问两个表...

那么,这两者中哪个是最好的选择......

谢谢

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

    JOIN,即使在 PRIMARY KEY 上,所需的时间也是顺序扫描的数倍。

    当然最好是看表,但我有根据的猜测是把它们放在一起会更好。

    如果要拆分的列很小且基数很高(很多不同的值),则将它们留在表中。

    但是,如果您所做的是规范化(而不是单纯的表拆分),那么规范化设计会更快。

    例如,如果您的数据如下所示:

    id  value
    
    1   Really really long value 1
    2   Really really long value 1
    3   Really really long value 1
    …
    1000   Really really long value 2
    1001   Really really long value 2
    1002   Really really long value 2
    …
    

    ,扫描这张表需要很长时间,因为值很大。

    对表格进行规范化会得到以下结果:

    id  value
    
    1   1
    2   1
    3   1 
    …
    1000   2
    1001   2
    1002   2
    …
    
    val_id  value
    1       Really really long value 1
    2       Really really long value 1
    

    扫描4-byte 整数行比扫描千字节VARCHAR 快得多,即使有额外的JOIN,第二个设计的查询也会更快完成。

    【讨论】:

    • 感谢您解释如何在字段包含大量数据时执行此操作,但在此特定情况下,我的字段包含非常少量的数据......
    【解决方案2】:

    我猜这取决于数据库架构。如果只有小字段,方法 A 可能更好。但是,如果有大字段可以放入较少使用的表中,则按照方法 B 中的建议将它们单独存储可能是有意义的。

    【讨论】:

    • 这些是小字段...它们不是我在访问 CASE A 中的表或 CASE B 中的表时将使用的任何复杂的连接语句...这些将包含的另外一件事在任何时间点最多 1000 行...
    【解决方案3】:

    如果不向我们提供更多详细信息,我们的答案不可能是确定的。您会拆分列以避免重复吗?如果是这样,您可能会看到简单查询的速度有所提高。但是,如果您有涉及复杂连接的查询,您可能会看到性能下降。很大程度上取决于你如何索引你的表。

    您的问题中没有足够的信息来给出更好的答案,没有深入讨论数据库设计的 2 小时。

    我建议阅读 stackoverflow 上的 how-do-i-ask-for-help-optimizing-fixing-queries-in-mysql 以了解如何寻求有关 MySQL 的帮助。

    【讨论】:

    • 这些是小字段...它们不是我在访问 CASE A 中的表或 CASE B 中的表时将使用的任何复杂的连接语句...这些将包含的另外一件事在任何时间点最多 1000 行... *不,我没有拆分列以避免重复,但我认为将很多行拆分为两个表会更好,如案例 B 中所述,但因为我不有很多经验我虽然先问你们......对不起,我是优化查询的新手,所以我不知道如何提出我的问题......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2019-08-13
    • 2012-10-26
    相关资源
    最近更新 更多