我创建了一个表,其中包含一个具有唯一键的文本列:
create table a(id int auto_increment key,a text unique);
当我运行show create table a;
时,它说唯一键使用哈希:
CREATE TABLE `a` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` text DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `a` (`a`) USING HASH
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
我所期望的是,当我insert into a (a)values('a');
,然后select * from a where a='a';
,它应该使用该键进行搜索。然而,它似乎没有,查询在大型数据集上很慢,explain select * from a where a='a';
产生以下结果:
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | a | ALL | a | NULL | NULL | NULL | 1 | Using where |
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
为什么MariaDB不使用该键进行搜索?
当我手动添加另一个键alter table a add key b(a) using hash;
时,它按预期工作,只是一个警告Specified key was too long; max key length is 3072 bytes
。
1条答案
按热度按时间q8l4jmvw1#
根据MDEV-13445,MariaDB优化器还不支持在文本类型上使用HASH索引。
参见MDEV-31072。