首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >唯一的键在MySQL中自动索引-是真的吗?

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

Stack Overflow用户
提问于 2014-02-11 10:37:26
回答 1查看 1.3K关注 0票数 2

我有一张大约200 K行的桌子:

代码语言:javascript
复制
 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“的查询相当慢--似乎它们没有被索引--这真的是真的吗?

以下是一些简单的测试。

主键

代码语言:javascript
复制
 mysql> select * from yaThread where id = 12999993
     -> ;
 Empty set (0.00 sec)

独一无二

代码语言:javascript
复制
 mysql> select * from yaThread where yaid = 123;
 Empty set (2.33 sec)
 mysql> select * from yaThread where yaid = 124;
 Empty set (0.96 sec)

非键字段

代码语言:javascript
复制
 mysql> select * from yaThread where info = 123;
 Empty set (0.46 sec)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-11 10:39:50

TL;DR:

是的,必须这样做,否则唯一性约束就无法维持。

背景资料:

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

Hashtable和hashtree是消化键的结构,输出的结果是一个数字(通常是十六进制表示法,但仍然只是一个数字)。这个数字对那个键来说通常是“唯一的”。因此,很容易根据任意长度的输入(1024字节varchar)存储少量数据(例如:16字节)。

大多数哈希表实现都允许对特定密钥进行重复(或者在不太可能的情况下,不同的键具有相同的哈希)。

SQL索引的实现是在磁盘可维护性或磁盘b-树上(在主题上有变化)。

主键引用块内的实际磁盘块+偏移量。唯一键引用主键。

基本上,主键被唯一的键(以及所有其他索引)用来引用行。唯一的键比主键慢(稍微慢一点)是很自然的,因为需要读取和交叉两个索引才能找到磁盘块和偏移量。

西德诺特:

主键本身也是唯一的键,并且由于被声明为PRIMARY,它们也会自动地被索引。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21699434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档