我有一个 MySQL 表,我希望我的主键是一个字符串。该字符串可能会更长一些(数百个字符)。
一个非常常见的查询是 an INSERT ... ON DUPLICATE KEY UPDATE
,这意味着 MySQL 必须经常检查表中是否已经存在主键。如果这是用一个天真的 strcmp 完成的,我想这可能需要相当长的时间,字符串越长。因此,手动对字符串进行散列(更短的字符串或其他数据类型)并将其用作我的主键或者我可以直接使用长字符串会更好吗?MySQL是否在内部散列主键字符串?
我有一个 MySQL 表,我希望我的主键是一个字符串。该字符串可能会更长一些(数百个字符)。
一个非常常见的查询是 an INSERT ... ON DUPLICATE KEY UPDATE
,这意味着 MySQL 必须经常检查表中是否已经存在主键。如果这是用一个天真的 strcmp 完成的,我想这可能需要相当长的时间,字符串越长。因此,手动对字符串进行散列(更短的字符串或其他数据类型)并将其用作我的主键或者我可以直接使用长字符串会更好吗?MySQL是否在内部散列主键字符串?
首先,当您在 varchar 字段上有索引时,mysql 不会strcmp
对所有条目执行 a 以找到正确的条目;相反,它使用二叉树,这比strcmp
通过导航找到正确的条目要快得多。
注意:如果需要,我会提供一些信息以提高性能,但请在遇到实际问题之前不要这样做。Varchar 索引很快,许多非常聪明的人已经对其进行了优化,并且在大多数情况下,它会超出您的需要。
话虽如此,如果您有很多条目和/或非常长的键,那么在其顶部使用散列索引可能会提高性能。
CREATE TABLE users
(
username varchar not null,
username_hashed varchar(32) not null,
primary key (username),
index (username_hashed)
);
例如,当您插入时,您可以设置username_hashed = md5(username)
。然后你用类似的东西搜索select otherfields from users where username_hashed = md5(username) and username = username
请注意,似乎mysql 5.5 原生支持哈希索引,这将使您不必手动执行此操作。
主键需要是字符串吗?它不能只是一个唯一索引,具有整数主自动增量吗?
使用整数进行搜索总是会更快,并且可能需要在您的应用程序中重新安排一些代码,但是搜索编号的主键与字符串总是会更好。查看这两个显示 int 和 varchar 内存差异的帖子: