【问题标题】:Which of those Tables Schema is Best for Performance (Columns vs. Rows)?哪些表架构最适合性能(列与行)?
【发布时间】:2018-02-18 21:06:05
【问题描述】:

我必须使用两种表模式之一,

First Schema:

SELECT * 
FROM `posts` 
WHERE `id` = '1'
     ----
id  title   content     col1    col2    col3
1   Title1  Content1    A       B       C

Second Schema:

SELECT p.*, GROUP_CONCAT(c.`col` ORDER BY `col_number`) AS cols 
FROM `posts` p
LEFT JOIN `cols` c ON c.`pid` = p.`id`
WHERE p.`id` = 1;
     ----
id  title   content     cols
1   Title1  Content1    A,B,C

在这两种情况下,对于post 表中的每个记录,我都仅限于three cols,并且会像在 Second Schema 中一样像array 一样收集它们强>A,B,C

在性能上使用哪种架构重要吗?

我知道的是:

第一个架构可以在col2, col3 上拥有NULL

第二个架构将没有NULL cols,除非某些列在之前有value 之后更新为NULL 除了col_number = 1ROW


在这两种情况下它们都将具有NULL cols 值,第二架构 NULL cols 可以是DELETED,但我不知道是保留它更好还是@987654339 @他们。


简而言之:哪个架构的性能更好?将NULL col 保留在第二模式DELETE 中更好吗?

【问题讨论】:

    标签: mysql sql sqlperformance


    【解决方案1】:

    您永远不应该将事物列表存储为分隔字符串。时期。您可以将它们存储为 JSON 或 XML 或使用其他方法,但在字符串中存储多个值是个坏主意。

    因此,第一种方法是更好的方法。在性能方面,两者对于基本查询应该非常相似。第一个允许您在每列上创建索引,这对于某些目的可能会有所帮助。

    空间使用非常相似。您正在谈论字符串与分隔符的长度字节。

    但对于关系建模,毫无疑问。单独的列——甚至是关联表中的单独行——是正确的解决方案。

    【讨论】:

    • 我在分隔字符串上使用explode() 将它们变成Array 中的PHP,不将它们保留为string,如果它是问题,但是对于First Scheme,我只是将它们直接放入Array,而无需将它们设为分隔字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2011-01-11
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多