1

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

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

4

2 回答 2

6

首先,当您在 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 原生支持哈希索引,这将使您不必手动执行此操作。

于 2013-06-01T10:28:17.457 回答
0

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

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

mysql 中 int(11) 列的大小(以字节为单位)?

MySQL中将字符串存储为varchar的内存使用情况

于 2013-06-01T10:32:32.470 回答