我有一张大约200 K行的桌子:
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“的查询相当慢--似乎它们没有被索引--这真的是真的吗?
以下是一些简单的测试。
主键
mysql> select * from yaThread where id = 12999993
-> ;
Empty set (0.00 sec)独一无二
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)发布于 2014-02-11 10:39:50
TL;DR:
是的,必须这样做,否则唯一性约束就无法维持。
背景资料:
为了确保唯一性,可以使用INDEX类型为UNIQUE列创建一个HASH。
Hashtable和hashtree是消化键的结构,输出的结果是一个数字(通常是十六进制表示法,但仍然只是一个数字)。这个数字对那个键来说通常是“唯一的”。因此,很容易根据任意长度的输入(1024字节varchar)存储少量数据(例如:16字节)。
大多数哈希表实现都允许对特定密钥进行重复(或者在不太可能的情况下,不同的键具有相同的哈希)。
SQL索引的实现是在磁盘可维护性或磁盘b-树上(在主题上有变化)。
主键引用块内的实际磁盘块+偏移量。唯一键引用主键。
基本上,主键被唯一的键(以及所有其他索引)用来引用行。唯一的键比主键慢(稍微慢一点)是很自然的,因为需要读取和交叉两个索引才能找到磁盘块和偏移量。
西德诺特:
主键本身也是唯一的键,并且由于被声明为PRIMARY,它们也会自动地被索引。
https://stackoverflow.com/questions/21699434
复制相似问题