【问题标题】:performance: mysql and joins性能:mysql和joins
【发布时间】:2010-12-26 10:56:51
【问题描述】:

这只是一个关于表格建模的问题。

我有一个像这样的用户表:

  • 用户名 varchar PRIMARY
  • 密码变量
  • 名字 varchar
  • 姓氏varchar
  • ...

然后有一些表,引用用户,如组和日志表...

我现在正在考虑将 id 作为 autoincerment unsigned integer 添加到用户表中。因为有人告诉我,整数连接比 varchars 连接更快。

对我来说这听起来很合理,因为需要比较的字节更少。

这是真的吗?或者你会说,没有必要在用户表中引入 id 列?

提前非常感谢:)

【问题讨论】:

标签: mysql join performance


【解决方案1】:

从技术上讲,由于您写的原因,整数应该稍微快一点。 但是,在您的情况下,真正的区别在于您可以选择使用自然键还是合成键。

如果您有一个稳定的(意味着它永远不会有机会)自然密钥,您将获得一个显着的性能优势。您通常可以完全删除与用户表的连接,因为您可以直接在其他表上进行查询,例如:

select ...
  from user_posts 
 where userid = 'JMW'

关于 INT/VARCHAR 讨论,这里有一篇你可能感兴趣的文章。

http://www.mysqlperformanceblog.com/2008/01/24/enum-fields-vs-varchar-vs-int-joined-table-what-is-faster/

【讨论】:

    【解决方案2】:

    根据您使用的引擎,MySQL 在使用 varchar 索引时可能会非常慢,尤其是 InnoDB。 MyISAM 会很快,但它不符合 ACID,所以你应该放弃它。

    这对于所有 DBMS 来说都是如此,整数总是比字符串快(您可以使用人工计算的超快速 CPU 操作来比较它,而不是比较字符串 char 和 char)。

    当您在 SQL 中进行 JOIN select 时,始终在索引字段上执行此操作,无论是否有整数,这可能是对您最重要的建议。

    编辑:实际上,大多数 DBMS 会优化 varchar 索引以进行读取,InnoDB 使用 BTREE 和散列字符串,这使得它在读取操作中非常快。 InnoDB 仍然存在 varchar 索引写入缓慢的问题,我找不到相关的错误,但它们仍然作为开放的 MySQL 错误存在于 MySQL 官方错误跟踪器中。计划使用 InnoDB 时,总是 void varchar 索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-05
      • 2021-01-28
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      相关资源
      最近更新 更多