Ole*_*leg 2 mysql sql database
我有一个大约有 200k 行的表:
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;
Run Code Online (Sandbox Code Playgroud)
我突然发现我的“yaid”查询相当慢 - 似乎它们没有索引 - 这是真的吗?
这里有一些简单的测试。
首要的关键
mysql> select * from yaThread where id = 12999993
-> ;
Empty set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
独特的
mysql> select * from yaThread where yaid = 123;
Empty set (2.33 sec)
mysql> select * from yaThread where yaid = 124;
Empty set (0.96 sec)
Run Code Online (Sandbox Code Playgroud)
非关键字段
mysql> select * from yaThread where info = 123;
Empty set (0.46 sec)
Run Code Online (Sandbox Code Playgroud)
是的,它们必须如此,否则就无法维持唯一性约束。
为了确保唯一性,可能使用 type 为列INDEX创建。UNIQUEHASH
哈希表和哈希树是消化密钥的结构,输出结果是一个数字(通常采用十六进制表示法,但仍然只是一个数字)。该数字对于该密钥通常是“唯一的”。因此,可以根据任意长度的输入(1024 字节 varchar)轻松存储少量数据(例如:16 字节)。
大多数哈希表实现允许特定键的重复(或者在不太可能发生的情况下,不同的键具有相同的哈希值)。
SQL 索引的实现是在磁盘哈希表或磁盘 B 树上(主题有所不同)。
PRIMARY 键引用实际磁盘块+块内的偏移量。UNIQUE 键引用 PRIMARY 键。
本质上,UNIQUE 键(以及所有其他索引)使用 PRIMARY 键来引用行。很自然,UNIQUE 键会(稍微)慢于 PRIMARY,因为两个索引都需要读取和相交才能找到磁盘块和偏移量。
主键本身也是唯一键,并且由于被声明,它们也会被自动索引PRIMARY。