【问题标题】:MYSQL autoincrement a column or just have an integer, difference?MYSQL自动增加一列还是只有一个整数,区别?
【发布时间】:2010-12-27 15:32:18
【问题描述】:

如果我有一列,设置为主索引,设置为INT。

如果我不将其设置为自动增量,而只是将唯一的随机整数插入其中,与自动增量相比,这会减慢未来的查询速度吗?

如果我在主索引和唯一索引为 INT 的表上运行 OPTIMIZE 会加快速度吗? (假设只有 2 列,第二列只是一些 INT 值)

(主要担心的是自动增量的上限,因为我的表中有很多添加和删除)

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果我不将其设置为自动增量,而只是在其中插入唯一的随机整数,与自动增量相比,这会减慢速度吗?

    MyISAM 中,它实际上会加速它(略微)。

    InnoDB 中,由于页面拆分,这可能会减慢INSERT 操作。

    这当然意味着你的号码是独一无二的。

    如果我优化一个主索引和唯一索引为 INT 的表,它会加快速度吗? (假设只有 2 列,第二列只是一些 INT 值)

    AUTO_INCREMENTINT 可以一起使用。

    OPTIMIZE TABLE 将压缩您的表和索引,释放删除的行和页面拆分留下的空间。如果您在桌子上有很多 DELETE 操作或 INSERT 乱序(例如在您的解决方案中使用随机数),这将有所帮助。

    它还将使索引页的逻辑和物理顺序相互保持一致,这将加快对PK (PK BETWEEN val1 AND val2) 的全面扫描或范围查询,但对于随机搜索几乎没有影响。

    (主要担心的是自动增量的上限,因为我的表中有很多添加和删除)

    BIGINT UNSIGNED(也可以与AUTO_INCREMENT 一起使用)最多可以容纳18446744073709551615 的值。

    【讨论】:

    • bigint 占用太多字节,会减慢我的数据库。抱歉,对于第二条评论,我的意思是强调 OPTIMIZE 部分,这意味着如果我优化(从而在表中按顺序对随机数进行排序)会加快速度吗?
    • @David:您希望每秒插入和更新多少次?
    • 插入和更新将继续,直到系统速度过慢,目前预计约为每秒 50 次。但我希望这个问题与 2 个表结构上的查询与查询有关,而不是专门针对我当前的系统。
    • @David19801:除了非常笼统或明显的问题外,没有单一正确答案,与具体情况无关。 您的预期用途的参数至关重要。
    【解决方案2】:

    自增整数的上限是18446744073709551615

    http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html

    你真的达到这个极限了吗?如果你这样做了,让 MySQL 在前一个数字上加一个是一种几乎无法改进的算法。

    【讨论】:

      【解决方案3】:

      AUTOINCREMENT 的上限是相应列中数字类型的上限。即使使用INT UNSIGNED,这也可能需要一段时间才能完成;使用BIGINT 将很难达到这一点(而且说真的,你在构建什么样的应用程序,每行额外增加 4 个字节太多了?)。所以,如果你要达到这个限制,你可以用自动增量来达到它,也可以不用它。

      另外,虽然没有 AUTOINCREMENT 会稍微加快插入速度,但我敢打赌,任何生成唯一整数而不是 AUTOINCREMENT 的代码都会比自动增量减慢代码速度(生成随机的不冲突的数字会随着你的桌子填满而变得越来越难)。

      换句话说,IMNSHO 这看起来像是过早的优化,并且不会显着提高代码速度(如果有的话),但它会降低它的可维护性(因为需要显式生成 PK,而不是数据库照顾它)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-23
        • 2020-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 2015-03-08
        相关资源
        最近更新 更多