当前位置: 首页 > article >正文

还在滥用模糊查找?这类场景下 MySQL 多值索引性能更加强悍!

在数据库查询中,模糊查找(如使用LIKE操作符和通配符%)是一种常见的方法,用于搜索包含特定字符串的数据。然而,随着数据量的增长,模糊查找的效率问题日益凸显,可能导致查询速度变慢、占用大量系统资源,甚至影响数据库的整体性能。相比之下,MySQL的多值索引在某些场景下提供了更为高效和灵活的查询解决方案。

一、模糊查找的局限性

模糊查找的局限性主要体现在以下几个方面:

  1. 查询效率低:模糊查找需要在数据库中遍历所有的数据记录,并进行字符串匹配。随着数据量的增加,查询速度会显著下降。
  2. 占用存储空间大:模糊查找在执行时需要创建临时表来存储查询结果,这会增加数据库的存储压力。
  3. 无法精确匹配:模糊查找是基于字符串的模糊匹配,无法像精确查询那样进行精确匹配,因此查询结果可能包含大量无关数据。
  4. 安全性问题:模糊查询返回大量数据结果,容易被恶意利用,从而引发数据库的安全问题。
二、多值索引的优势

从MySQL 8.0.17版本开始,InnoDB存储引擎支持多值索引。多值索引是在存储值数组的列上定义的二级索引,可以为单个数据记录创建多个索引记录(N:1)。多值索引主要用于索引JSON数组,但也可以应用于其他场景。

多值索引的优势包括:

  1. 高效查询:多值索引允许数据库引擎在索引级别上直接处理数组或集合类型的数据,从而提高了查询效率。
  2. 灵活性强:多值索引可以应用于JSON数组、字符串数组等多种数据类型,提供了灵活的查询方式。
  3. 减少I/O操作:由于多值索引可以在索引级别上直接处理数据,因此可以减少对磁盘的I/O操作,进一步提高查询性能。
三、多值索引的应用场景

多值索引在以下场景中表现出色:

  1. JSON数组查询:多值索引最初就是为索引JSON数组而设计的。例如,在一个包含用户信息的JSON文档中,可以使用多值索引来快速查询特定邮编的用户。
  2. 字符串数组查询:除了JSON数组外,多值索引还可以应用于字符串数组等场景。例如,在一个包含商品信息的表中,可以使用多值索引来快速查询包含特定标签的商品。
  3. 复合索引的一部分:多值索引还可以定义为复合索引的一部分,与其他单值索引一起使用,以提供更强大的查询能力。
四、多值索引的创建和使用

在MySQL中,可以通过CREATE TABLE、ALTER TABLE或CREATE INDEX语句来创建多值索引。创建多值索引时,需要使用CAST(… AS …ARRAY)将JSON数组或字符串数组转换为SQL数据类型数组,并生成一个虚拟列。然后,在虚拟列上创建一个函数索引(也称为虚拟索引),即构成了多值索引。

例如,以下语句在名为customers的表中的JSON列custinfo上的数组$.zipcode上创建了一个多值索引zips:

CREATE TABLE customers (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    modified DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    custinfo JSON,
    INDEX zips((CAST(custinfo->'$.zipcode' AS UNSIGNED ARRAY)))
);

在查询时,可以使用MEMBER OF()、JSON_CONTAINS()和JSON_OVERLAPS()等函数来利用多值索引。例如,以下查询使用MEMBER OF()函数来查找包含特定邮编的用户:

SELECT * FROM customers WHERE 94507 MEMBER OF (custinfo->'$.zipcode');
五、结论

综上所述,模糊查找虽然在某些场景下仍然有用,但随着数据量的增长,其效率问题日益凸显。相比之下,MySQL的多值索引在某些场景下提供了更为高效和灵活的查询解决方案。通过合理利用多值索引,可以显著提高查询性能,减少系统资源占用,提升用户体验。因此,在需要处理数组或集合类型数据的场景中,建议优先考虑使用多值索引来替代模糊查找。


http://www.kler.cn/news/355468.html

相关文章:

  • Leetcode|209.长度最小的子数组 And 59.螺旋矩阵||
  • 【C++】哈希表的封装——同时实现unordered_map和unordered_set
  • 【Vue】Vue3.0 (十二)、watchEffect 和watch的区别及使用
  • 【电商项目】1分布式基础篇
  • ASPICE在国内应用的挑战与改进空间
  • 奥比中光opencv显示可见光图片
  • [论文笔记] llama-factory 微调qwen2.5、llama3踩坑
  • php strtr 函数的坑
  • Android二代抽取壳简易实现和踩坑记录
  • <Linux> 线程池
  • vue项目中使用websocket
  • MAC地址漂移实验
  • 【ShuQiHere】智慧城市(Smart City)全面指南:AI如何重塑城市生活 ️
  • [图形学]蒙特卡洛积分方法介绍及其方差计算
  • AcWing 3817:数组 ← 贪心算法
  • JavaWeb 23.NPM配置和使用
  • HTML5教程(四) - 结构标签
  • git+cmake将Open3D配置到visual studio
  • Android中 tools:text 和 android:text区别
  • Java JDK的面试题