【问题标题】:Does having fixed size rows in MySQL improve query performance?在 MySQL 中使用固定大小的行会提高查询性能吗?
【发布时间】:2021-08-05 16:14:54
【问题描述】:

我正在处理 MySQL 数据库中的一个相当大的表,大约有 1000 万行。其中一列是VARCHAR(50),但其余的都是固定大小的(intdatetime 等)。考虑到每一行都是固定大小,将这个字段更改为 CHAR(50) 会提高 MySQL 扫描表的能力吗?

我了解CHARVARCHAR 的性能优势——这不是我关心的问题。我刚刚读过固定大小的行可以在处理大型表时加快 MySQL 的速度,我只是想知道这是否属实以及在何种程度上。

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

    简短回答:

    长答案:

    固定行大小是老生常谈。当 MyISAM 是唯一的引擎时,它有一个罕见的用例。随着它的消亡和 InnoDB 的统治,它真的已经过时了。

    如果您的 Varchar 通常很短,那么您的表占用的磁盘空间大约是 CHAR(50) 的两倍,是 VARCHAR(50) 的两倍。这意味着两倍的 I/O。 I/O 是性能的“慢”部分,不是像 MyISAM 可能做的那样“就地”执行UPDATE 的能力而 InnoDB 没有(或者至少不完全是)。

    如今,1000 万行只是中等大小。但即使是十亿行的表,我也会给出同样的建议——更加强调

    InnoDB 使用 16KB 的“块”。当然,如果 Varchar 中的文本扩展导致块拆分,则需要付出一些努力。但与此同时,该块的行数是原来的两倍。等等。

    另一点:定位行的成本远高于将其拆分为列的成本。

    【讨论】:

    • 还值得一提的是,即使在 MyISAM 表的边缘情况下,也必须将 all 列设为固定宽度。如果给定表中还剩下任何可变宽度的列,那将没有任何好处。
    猜你喜欢
    • 2019-09-16
    • 2010-10-05
    • 2016-03-04
    • 2011-12-03
    • 2023-04-08
    • 2016-08-18
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多