我有一张大约有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)
答案 0 :(得分:2)
是的,它们必须是,否则不能维持唯一性约束。
为了确保唯一性,可以使用INDEX
类型为UNIQUE
列创建HASH
。
哈希表和哈希表是消化密钥的结构,输出结果是一个数字(通常是十六进制表示法,但仍然只是一个数字)。该号码通常对该键是“唯一的”。因此,根据任何长度输入(1024bytes varchar),很容易存储少量数据(例如:16bytes)。
大多数散列表实现允许特定键的重复(或者在不太可能的情况下,不同的键具有相同的散列)。
SQL索引的实现位于磁盘hastables或磁盘b-trees上(主题有变化)。
PRIMARY键引用块内的实际磁盘块+偏移量。 UNIQUE键引用PRIMARY键。
UNIQUE键(以及每个其他索引)基本上使用PRIMARY键来引用行。很自然,UNIQUE键(略微)比PRIMARY慢,因为需要读取和交叉两个索引才能找到磁盘块和偏移量。
主键本身也是唯一键,由于声明为PRIMARY
,它们也会自动编入索引。