【问题标题】:MySQL: CHAR (13) or BIGINT(13) when considering performance?MySQL:在考虑性能时是 CHAR (13) 还是 BIGINT(13)?
【发布时间】:2013-12-13 09:05:32
【问题描述】:

我将所有可能的 ISBNS 存储在一个表中。这些 isbns 总是 13 位长并且总是数字。每个 ISBN 都以“978”或“979”开头。从纯粹的性能角度来看,将列设置为 BIGINT (13) 或 CHAR (13) 会更好吗?为什么?是否有另一种更有效的方式来存储这些数据?

【问题讨论】:

标签: mysql


【解决方案1】:

我只是在一个 1M 行的表上做一个测试,作为我正在进行的一个类似项目的一部分。

BIGINT -  0.0003 sec
Varchar(13)- 1.3996 sec
CHAR(13) - 1.2910 sec

毫无疑问我会选择 BIGINT

【讨论】:

    【解决方案2】:

    首先,BIGINT(13) 13 的意思不是他们内部的存储空间。 BIGINT(n) 总是占用 8 个字节。而且,CHAR(13) 占用 13 个字节。所以,BIGINT 更快。

    如果小尺寸对您很重要,而我不是 ISBN 专家,如果 ISBN 以“978”或“979”开头,剩下的部分是 10 位数吗?然后你可以创建 2 个列,

    isbn_prefix CHAR(1)、remain_part INT。 isbn_prefix 为 '978' 存储 '8',为 979 存储 '9',remain_part 存储 10 位数字。 BIGINT 只需要 4 个字节。所以,小于BIGINT

    但是,简单是最好的。如果我是你,我会使用BIGINT

    【讨论】:

    • 感谢 BIGINT Vs。 CHAR (13) 澄清。但是,您将 isbn 分解为其前缀和剩余部分的建议提出了一个疑问:如果我要这样做,那么当我搜索 ISBN 时(例如:9780321832184)。我必须这样做: SELECT * FROM 'isbns' WHERE prefix = '8' AND remaining_part = '0321832184' 。这不会比:SELECT * FROM isbns WHERE isbn = 9780321832184 慢吗?
    • 那么,你需要制作复合索引INDEX (isbn, prefix)。或 prefix 只有 '8' 或 '9' isbn INDEX 可能就足够了。你有很多数据吗?然后测试很容易。但如果没有,BIGINT 将是最佳选择。
    【解决方案3】:

    就存储而言,最有效的方法是使用数据类型DECIMAL(13)

    这总共需要 6 个字节。 (4 个字节将存储 9 个十进制数字,其余 4 个十进制数字需要另外 2 个字节。)

    【讨论】:

    • 与 Bigint 相比,MySQL 引擎处理十进制类型列需要更多的时间,这最终会超过每条记录节省 2 个字节的成本..
    猜你喜欢
    • 1970-01-01
    • 2011-05-01
    • 2012-10-17
    • 2012-12-29
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多