我正在为字典创建一个数据库。考虑WORD表格。我目前的计划是让它的主键word_id
是一个整数,然后给它另一个属性text
,它是单词的文本表示。
然而,我认为,由于这是一本词典,适用于一个单词的所有定义、发音和词性都会在其标题下找到,其他拼写相同的单词绝对不可能有不同的页面。因此,将text
作为主键是有意义的,并且我不需要word_id
。
我现在的问题是,哪种方法会执行得更快?看起来给它一个整数主键更好,因为它是一个易于比较的基元类型,尤其是在将其作为其他表的外键进行检查时更有用。我不确定,但我认为,如果主键是一个字符串,那么将其与其他表的外键进行检查需要进行基本的每个字符的比较,这需要更长的时间,再加上不区分大小写的检查带来的额外负担。
此外,如果速度不是一个很大的问题,我还应该考虑其他因素吗?我即将使用的数据库是MySQL。
您可以检查这个SO问题:
INT和VARCHAR主键之间是否存在真正的性能差异?
我认为它涵盖了你的问题。
我现在的问题是,哪种方法会执行得更快?看起来给它一个整数主键更好,因为它是一个易于比较的基元类型,尤其是在将其作为其他表的外键进行检查时更有用。我不确定,但我认为,如果主键是一个字符串,那么将其与其他表的外键进行检查需要进行基本的每个字符的比较,这需要更长的时间,再加上不区分大小写的检查带来的额外负担。
我的猜测是你是对的,但与数据库服务器的其他处理任务(例如网络+磁盘I/O)相比,差异太小了,所以这无关紧要。
尽管默认情况下会为主键创建索引,并且正如您所指出的,如果它是整数id,那么匹配会更快。但是,无论主键是什么,您都可以在表的任何列上创建索引。因此,性能更多地取决于索引而不是主键。
支持int的另一点是字符串会导致以下问题:
-
比较大小写是否敏感?
-
文本是否经过修剪或有其他不可见的空格?
-
编码正确吗?(如果数据从另一个系统导入/导出,这可能是一个问题。)
-
有意义的键会被编辑,而没有人可以编辑标识列,也没有人对编辑guid或无意义的int感兴趣。