如果主键是字符串(varchar)或整数,在MySQL中检索行是否更快?

时间:2012-01-09 17:54:55

标签: mysql sql performance performance-testing

我正在为字典创建数据库。考虑表格WORD。我目前的计划是使其主键word_id成为一个整数,然后给它另一个属性text,这是该单词的文本表示。

然而,我认为因为它是一本字典,所以适用于单个单词的所有定义,发音和词性都将在其标题下找到,并且对于具有相同词的其他单词绝对没有办法拼写有不同的页面。因此,将text作为主键是有道理的,我不需要word_id

我现在的问题是,哪种方法会更快?看起来给它一个整数主键更好,因为它是一个容易比较的原始类型,在将其作为其他表的外键检查时尤其有用。我不确定,但我认为如果主键是一个字符串,那么对其他表的外键进行检查涉及一个基础的每字符比较,这需要更长的时间,再加上不区分大小写的检查的负担。

另外,如果速度不是一个很大的问题,我还应该考虑其他因素吗?我即将使用的数据库是MySQL。

4 个答案:

答案 0 :(得分:3)

您可以查看此问题:

Is there a REAL performance difference between INT and VARCHAR primary keys?

我认为它涵盖了你的问题。

答案 1 :(得分:1)

  

我现在的问题是,哪种方法会更快?看起来给它一个整数主键更好,因为它是一个容易比较的原始类型,在将其作为其他表的外键检查时尤其有用。我不确定,但我认为如果主键是一个字符串,那么根据其他表的外键检查它涉及一个基础的每个字符比较,这需要更长的时间,加上不区分大小写检查的额外负担。

我的猜测是你是对的,但与数据库服务器的其他处理任务(例如网络+磁盘I / O)相比差别很小,无关紧要。

答案 2 :(得分:1)

另一个支持int的观点是字符串导致以下问题:

  1. 比较大小写是否敏感?

  2. 是否修剪了文字或是否有其他不可见的空格?

  3. 编码是对的吗? (如果从/向另一个系统导入/导出数据,则可能会出现问题。)

  4. 有意义的密钥需要编辑,而没有人可以编辑标识列,没有人对编辑guid或无意义的int感兴趣。

答案 3 :(得分:1)

虽然默认情况下会为主键创建索引,并且如果您指示它是否为整数id,则匹配将更快。但是,无论您的主键是什么,您始终可以在表的任何列上创建索引。因此,性能更多地取决于索引而不是主键。