MySQL - 主键的字符串比较速度

时间:2013-06-01 10:13:29

标签: mysql

我有一个MySQL表,我希望我的主键是一个字符串。这个字符串可能会更长一些(数百个字符)。

一个非常常见的查询是INSERT ... ON DUPLICATE KEY UPDATE,这意味着MySQL必须检查表中的主键是否已经存在很多。如果这是用一个天真的strcmp完成的,我想这可能需要一段时间,字符串就越长。因此,手动散列字符串(更短的字符串或其他数据类型)并将其用作我的主键或者我可以直接使用长字符串更好吗? MySQL是否在内部散列主键字符串?

2 个答案:

答案 0 :(得分:3)

首先,当你在varchar字段上有索引时,mysql不对所有条目执行strcmp以找到正确的索引;相反,它使用binary tree,比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 support hash index natively,这样您就不必手动执行此操作。

答案 1 :(得分:0)

主键是否需要是字符串?它不能只是一个唯一的索引,具有整数主要自动增量?

使用整数进行搜索总是会更快,并且可能需要在应用中进行一些代码重新排列,但是搜索带编号的主键和字符串总是会更好。 看看这两个显示int和varchar的内存差异的帖子:

What is the size of column of int(11) in mysql in bytes?

Memory usage of storing strings as varchar in MySQL