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

news2024/10/19 6:26:16

在数据库查询中,模糊查找(如使用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.coloradmin.cn/o/2218290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#的小数位保留以及四舍五入

C#使用Math.Round("数值","保留位","保留方式")进行小数位保留以及四舍五入 //1.MidpointRounding.ToEven(四舍六入五成双) //当保留小数位后一位为0~4时,舍去末位 var x1 Math.Round(1.124, 2, MidpointRo…

立仪科技:光谱共焦传感器精准测量玻璃

光谱共焦测量技术作为一种创新的光学检测方法,近年来在工业领域引起了广泛关注。 它以其高精度、非接触式的特点,特别适用于透明或半透明材料如玻璃的厚度和表面形貌测量。 接下来,立仪科技小编将深入探讨光谱共焦技术在玻璃测量上的应用及其…

计算机毕业设计Hadoop+Hive+Spark+Flink广告推荐系统 广告预测 广告数据分析可视化 广告爬虫 大数据毕业设计 深度学习 机器学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 专业 小四号宋体 班级 小…

飞机大战告尾

参考 PPO算法逐行代码详解 链接 通过网盘分享的文件:PlaneWar 链接: https://pan.baidu.com/s/1cbLKTcBxL6Aem3WkyDtPzg?pwd1234 提取码: 1234 10.17关于博客发了又改这件事 悲催的事 今天训练了一早上ppo模型,满怀期待的检测成果时发现一点长进都…

mac安装brew时踩坑解决方案

安装包 mac上如果按照git等工具可能会使用brew,例如使用:$ brew install git命令,如果电脑没有按照brew,则会提示:zsh: command not found: brew 解决方案 需要我们打开brew的官网https://brew.sh/,复制…

动态规划一>下降路径最小和

1.题目&#xff1a; 2.解析&#xff1a; 代码&#xff1a; /**1.创建dp表2.初始化3.填表4.返回值*/public int minFallingPathSum(int[][] matrix) {int n matrix.length;int[][] dp new int[n1][n2];int minNum Integer.MAX_VALUE; for(int i 1; i < n; i) dp[i][0]…

【CSS】纯CSS Loading动画组件

<template><div class"ai-loader-box"><!-- AI loader --><div class"ai-loader"><div class"text"><p>AI智能分析中....</p></div><div class"horizontal"><div class&quo…

简单说说 spring是如何实现AOP的(源码分析)

在spring生命周期流程中&#xff0c;有一个过程是执行BeanPostProcessor的后置方法 BeanPostProcessor 是一个接口&#xff0c;其实现有 aop实现的核心类是AbstractAutoProxyCreator&#xff0c;其位于spring-aop包下&#xff0c;实现了BeanPostProcessor //BeanPostProcesso…

【Java小白图文教程】-04-分支结构

本套课程将会从0基础讲解Java语言核心技术&#xff0c;适合人群&#xff1a; 大学中开设了Java语言课程的同学想要专升本或者考研的同学想要考计算机等级证书的同学想要从事Java相关开发开发的同学 精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https:/…

transformers 推理 Qwen2.5 等大模型技术细节详解(一)transformers 初始化和对象加载(文末免费送书)

上周收到一位网友的私信&#xff0c;希望老牛同学写一篇有关使用 transformers 框架推理大模型的技术细节的文章。 老牛同学刚开始以为这类的文章网上应该会有很多&#xff0c;于是想着百度几篇质量稍高一点的回复这位网友。结果&#xff0c;老牛同学搜索后发现&#xff0c;类…

力扣61~65题

题61&#xff08;中等&#xff09;&#xff1a; 分析&#xff1a; python代码&#xff1a; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def rot…

【含开题报告+文档+PPT+源码】基于SpringBoot电脑DIY装机教程网站的设计与实现

开题报告 随着科技的发展和人们对电脑需求的增加&#xff0c;越来越多的人开始自己组装电脑。然而&#xff0c;针对初学者来说&#xff0c;如何选择合适的硬件配置并进行装机是一个相对复杂的过程。随着各种品牌、型号和规格的硬件不断增多&#xff0c;用户需要一个方便快捷的…

Java项目编译不通过,IDEA无法运行或调试Unit test类

mvn test可以通过&#xff0c;但是通过IDEA无法运行或调试&#xff0c;总是弹出一些依赖错误比如&#xff1a; 程序包xxx.xxx.xxx 不存在或找不到符号 解决办法 步骤1&#xff1a;IDEA 打开 File -> Setting ->Compiler &#xff0c;找到“Automatically show first …

20 Shell Script输入与输出

标出输入、标准输出、错误输出 一、程序的基本三个IO流 一&#xff09;文件描述符 ​ 任何程序在Linux系统中都有3个基本的文件描述符 ​ 比如: ​ cd/proc/$$/fd ​ 进入当前shell程序对于内核在文件系统的映射目录中: [rootlocalhost ~]# cd /proc/$$/fd [rootlocalhos…

基于System.js的微前端实现(插件化)

目录​​​​​​​ 写在前面 一、微前端相关知识 &#xff08;一&#xff09;概念 &#xff08;二&#xff09; 优势 &#xff08;三&#xff09; 缺点 &#xff08;四&#xff09;应用场景 &#xff08;五&#xff09;现有框架 1. qiankun 2. single-spa 3. SystemJ…

【MR开发】在Pico设备上接入MRTK3(一)——在Unity工程中导入MRTK3依赖

写在前面的话 在Pico上接入MRTK3&#xff0c;目前已有大佬开源。 https://github.com/Phantomxm2021/PicoMRTK3 也有值得推荐的文章。 MRTK3在PICO4上的使用小结 但由于在MacOS上使用MRTK3&#xff0c;无法通过Mixed Reality Feature Tool工具管理MRTK3安装包。 故记录一下…

Dockerr安装Oracle以及使用DBeaver连接

拉取镜像 pull container-registry.oracle.com/database/free:latest 创建容器 说明一下我现在的最新版本是23 docker run -d --name oracle23i -h xrilang -p 1521:1521 container-registry.oracle.com/database/free:latest 查看日志 docker logs oracle23i 设置密码 因为创建…

登录时用户名密码加密传输(包含前后端代码)

页面输入用户名密码登录过程中&#xff0c;如果没有对用户名密码进行加密处理&#xff0c;可能会导致传输过程中数据被窃取&#xff0c;就算使用https协议&#xff0c;在浏览器控制台的Request Payload中也是能直接看到传输的明文&#xff0c;安全感是否还是不足。 大致流程&a…

第二百八十八节 JPA教程 - JPA查询连接OrderBy示例

JPA教程 - JPA查询连接OrderBy示例 以下代码显示如何使用ORDER BY子句和连接条件。 List l em.createQuery("SELECT e " "FROM Project p JOIN p.employees e " "WHERE p.name :project " "ORDER BY e.name").setParameter("pr…

【MogDB】MogDB5.2.0重磅发布第四篇-支持windows版gsql,兼容sqlplus/sqlldr语法

一、背景 目前仍然很多客户的运维机使用windows操作系统&#xff0c;开发人员也是在windows环境上进行编码测试&#xff0c;甚至还有一些客户管理比较严格&#xff0c;禁止开发人员登录服务器进行操作。在MogDB 5.2.0版本之前&#xff0c;没有提供windows平台的gsql&#xff0…