返回

浅析MySQL8.0.17 - Multi-Valued Indexes

见解分享


虽然在现代主流的数据库中,索引技术已经发展得比较完善,在应对一些常见查询时,已经能够满足大多数用户的需求,但针对某些特定的数据操作,现有索引技术还是有些力不从心,比如对半结构化数据,数组类型进行索引后,原有的单值索引技术就无法进行帮助查询,并且现有数据库系统在对数组或其他集合进行搜索时,其查询方式也过于刻板。


为了打破这一界限,提高这类数据的查询效率,MySQL官方在MySQL8.0.17 版本中引入了一项新功能——Multi-Valued Indexes(多值索引)。该特性在MySQL 8.0.17 版本中作为 GA 功能被正式发布,我们可以在稳定的生产环境中使用它。


本文将对 Multi-Valued Indexes 进行简单的介绍,让大家初步了解这一新功能。



Multi-Valued Indexes


Multi-Valued Indexes 顾名思义,就是索引上对于同一个 Primary key,可以建立多个二级索引项。实际上已经对 array 类型的基础功能做了支持(感觉官方未来一定会推出类似 PG 的 array 列类型),并基于 array 类型对集合的操作和数组对二进制协议的兼容做了进一步扩展。


简言之,Multi-Valued Indexes 允许我们对数组类型的数据建立索引,并在查询时直接使用索引进行查找。这将大大提高对数组类型数据的查询效率,并且可以简化查询语句的编写。


示例


为了更好地理解 Multi-Valued Indexes 的使用方式,我们来看一个示例。假设我们有一个名为 students 的表,该表中有三个字段:idnamescoresscores 字段是一个数组类型,存储了每个学生的成绩。


CREATE TABLE students (
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL,
  scores ARRAY,
  PRIMARY KEY (id)
);

现在,我们可以在 scores 字段上创建一个 Multi-Valued Indexes:


CREATE INDEX scores_idx ON students (scores);

创建好索引后,我们就可以使用它来对数组类型的数据进行查询了。例如,我们可以使用以下查询来查找成绩中包含 90 分的学生:


SELECT * FROM students WHERE scores @> '[90]'

这个查询将使用 scores_idx 索引来查找所有成绩中包含 90 分的学生。这比使用传统的扫描索引要快得多,尤其是当表中数据量很大时。


总结


Multi-Valued Indexes 是 MySQL 8.0.17 中的一项新功能,它允许我们在索引上为同一个 Primary key 建立多个二级索引项。这将大大提高对数组类型数据的查询效率,并且可以简化查询语句的编写。


在实际应用中,Multi-Valued Indexes 可以用于各种场景,例如:


  • 搜索引擎 :可以对文档中的单词建立 Multi-Valued Indexes,以便快速查找包含特定单词的文档。
  • 电子商务 :可以对商品的属性建立 Multi-Valued Indexes,以便快速查找具有特定属性的商品。
  • 社交媒体 :可以对用户的兴趣爱好建立 Multi-Valued Indexes,以便快速查找具有相同兴趣爱好的用户。

Multi-Valued Indexes 是一个非常有用的功能,它可以大大提高数据库的查询效率。如果您正在使用 MySQL 8.0.17 或更高版本,我强烈建议您尝试使用 Multi-Valued Indexes。