在MySQL中自动索引唯一键 - 是真的吗?

时间:2014-02-11 10:37:26

标签: mysql sql database

我有一张大约有20万行的表

 CREATE TABLE `yaThread` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `yaid` varchar(255) DEFAULT NULL,
 `complete` datetime DEFAULT NULL,
 `version` int(11) DEFAULT '0',
 `code` varchar(255) DEFAULT NULL,
 `info` varchar(255) DEFAULT NULL,
 `stCount` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `yaidk` (`yaid`)
 ) ENGINE=InnoDB AUTO_INCREMENT=510312 DEFAULT CHARSET=utf8;

我突然发现我的“yaid”查询速度相当慢 - 似乎它们没有被编入索引 - 这是真的吗? 这里有一些简单的测试

PRIMARY KEY

 mysql> select * from yaThread where id = 12999993
     -> ;
 Empty set (0.00 sec)

UNIQUE

 mysql> select * from yaThread where yaid = 123;
 Empty set (2.33 sec)
 mysql> select * from yaThread where yaid = 124;
 Empty set (0.96 sec)

非关键字段

 mysql> select * from yaThread where info = 123;
 Empty set (0.46 sec)

1 个答案:

答案 0 :(得分:2)

TL; DR:

是的,它们必须是,否则不能维持唯一性约束。

背景信息:

为了确保唯一性,可以使用INDEX类型为UNIQUE列创建HASH

哈希表和哈希表是消化密钥的结构,输出结果是一个数字(通常是十六进制表示法,但仍然只是一个数字)。该号码通常对该键是“唯一的”。因此,根据任何长度输入(1024bytes varchar),很容易存储少量数据(例如:16bytes)。

大多数散列表实现允许特定键的重复(或者在不太可能的情况下,不同的键具有相同的散列)。

SQL索引的实现位于磁盘hastables或磁盘b-trees上(主题有变化)。

PRIMARY键引用块内的实际磁盘块+偏移量。 UNIQUE键引用PRIMARY键。

UNIQUE键(以及每个其他索引)基本上使用PRIMARY键来引用行。很自然,UNIQUE键(略微)比PRIMARY慢,因为需要读取和交叉两个索引才能找到磁盘块和偏移量。

旁注:

主键本身也是唯一键,由于声明为PRIMARY,它们也会自动编入索引。