mysql联合索引like_MySQL全文索引、联合索引、like查询、json查询速度大比拼

查询背景

有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outline,存了一对多关系(保存了多个编码,例如jy1577683381775)

我们需要在这10万条数据中检索特定类型的数据,目标总数据量:2931条

SELECTCOUNT(*) FROM tmp_test_course WHERE`type`=5AND del=2AND is_leaf=1

327295a6cb278482a5b50a620862152d.png

我们在限定为上面类型的同时,还得包含下面任意一个编码(也就是OR查询)

8366ad40c742c59a09648ab3995418d3.png

下面分别列出4种方式查询outline字段,给出相应的查询时间和扫描行数

一、like查询

耗时248毫秒

a826eef3672ebbf2efe1d509ca92c26d.png

EXPLAIN分析结果如下,全表扫描

be972234fdcecf5132fd9f6d5fa9817d.png

二、json函数查询

json官方函数

耗时196毫秒,速度稍微快了一点

6d5e579e190dbf9e8421418424e41643.png

EXPLAIN分析结果如下,还是全表扫描

9a225994c6b9b363010fb5574145e1fa.png

三、联合索引查询

下面为该表建立一个联合索引(本来想建一个type-del-is_leaf_outline的索引,但是outline字段太长限制,所以只加type-del-is_leaf_的联合索引

ALTERTABLE tmp_test_course ADDKEY`type-del-is_leaf` (`type`,`del`,`is_leaf`)

加入索引后再执行like和json查询,明显提速。

like执行用了136毫秒,json查询用了82.6毫秒,由此可见json查询比like快

60c7ed029f5990c3ae9583cbf169b5d1.png

b44be3d462c3de70b238c8dcb0c81dd1.png

EXPLAIN分析结果如下,两者查询扫描的行数都限定在了2931行

e0bebed6ad84565353e55550a997f704.png

cadb06d022a34f2f7fecac4e55aecbd8.png

四、全文索引查询

因为全文索引只支持CHAR、VARCHAR和TEXT,我们需要把JSON字段定义改一下

ALTERTABLE tmp_test_course MODIFY`outline`VARCHAR(1024) NOTNULLDEFAULT'[]'

添加全文索引

ALTERTABLE tmp_test_course ADD FULLTEXT INDEXoutline (outline);

现在再来用全文索引进行检索

耗时11.6毫秒,速度提升极其明显,可见全文索引的牛逼。

19aae7ca485431b33a58276af4510516.png

EXPLAIN分析结果如下,显示只扫描了一行

b0f5d1fb56ab548a68cb7c66d5ae0da7.png

结论

以下是4种情况的执行结果

全文索引: 11.6ms联合索引:82.6ms(json)、136ms(like)json函数查询:196ms

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566316.shtml

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

相关文章

mysql 代替分号_除了使用分号(;)终止符之外,还有其他可执行MySQL查询的内置命令吗?...

借助以下内置命令,即使不使用分号(;)终止符,MySQL也可以执行查询。自我我们可以通过使用\ G选项来使用此命令。这意味着将当前语句发送到要执行的服务器,并以垂直格式显示结果。当我们使用\ G并在一条语句(单行或多行)中省略分号(;)时&#x…

python在线包安装mysql_python安装mysql的依赖包mysql-python操作

一般情况下,使用pip命令安装即可:[rootdthost27 ~]# pip install mysql-python但是在实际工作环境中,往往会安装失败,这是因为系统缺少mysql的相关依赖组件。所以必须先安装mysql-devel类的包,而且必须要对应好mysql客…

python数组切片赋值后不改变原数组_js数组操作---改变原数组和不改变原数组的方法整理...

一、改变原始数组的方法:1、pop()删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。如果数组已经为空,则 pop() 不 改变数组,并返回 undefined 值。arrayObject.pop() 。2、push()push() 方…

收藏列表放入MySQL还是redis_mysql导入redis

程序遍历MySQL然后插入Redis,效率极低。利用redis-cli命令行工具有一个批量插入模式,是专门为批量执行命令设计的。可以把Mysql查询的内容格式化成redis-cli可用数据格式。1, 根据表创建一个sql,将数据转换为redis可用的格式(1) 表…

java 虚拟机内存不足_JAVA虚拟机内存不够解决办法

软件152笪世海1. 查找matlab根路径.在matlab命令行中敲入:matlabroot显示根路径,如:C:\MATLAB72.查看当前Java虚拟机最大堆内存, 敲入:java.lang.Runtime.getRuntime.maxMemory3.查看Java虚拟机版本.敲入:version -java4.在 $MATLAB\bin\$ARCH 路径下新建java.opts文件.$MATLAB…

Java发送会议邮件 时区_【上海校区】基于JavaMail的日历(会议)邮件发送实现

[Java] 纯文本查看 复制代码/*** 发送会议邀请邮件** param toMailAddress 收件人(邀约人),支持多个* param mailSubject 邮件主题* param mailContent 邮件内容(建议传入velocity去构建生成的HTML内容)* param summary 摘要,即日历(日程)上显示的标题* …

java saxexception_SAXException

公布的WebService别人调用时出现org.xml.sax.SAXexception发布的WebService别人调用时出现org.xml.sax.SAXexception发布的webservice,返回的一个json,php调用的时候有一定几率出现org.xml.sax.SAXexception,不知道是什么原因3热度com.ibm.ws.jsp.JspCor…

fun函数python_Python函数

Python函数一般函数定义方式def sum(a, b): return ab##返回a与b的和123一些概念与特性嵌套Python的函数是可以嵌套定义的def Fun1(): print("Runing Fun1...") def Fun2(): print("Runing Fun2...") Fun2()12345但是要注意在内部定义就只能在内部使用&…

java 给对象创建实例_Java中创建(实例化)对象的五种方式

Java中创建(实例化)对象的五种方式1、用new语句创建对象,这是最常见的创建对象的方法。2、通过工厂方法返回对象,如:String str String.valueOf(23);3、运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance(…

java markdown转word_一键将 Word 转换为 Markdown

李缘 | | Stata 连享会 (知乎 | 简书 | 码云方法一:Writage Pandoc -- 双剑合璧!打开 Writage网页,点击Download,再点击Download Now完成下载网页下载运行安装程序,一般按照默认选项安装就好啦安装重启电脑&#xff0…

java盒图_java合成图片

package com.pbids.sanqin.util;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.net.URL;public class PicUtil {private Font font new Font("宋体", Font.PLA…

mysql+两天前+函数_Mysql 日期函数

一、MySQL 获得当前日期时间 函数1.获取当前日期时间(date time):now()sysdate()sysdate()和now()的区别在于sysdate() 在函数执行时动态得到值, now() 在执行开始时值就得到了,看下面的例子就明白了:mysql> select sysdate(),sleep(3),s…

java队列优先级_优先级队列-Java的PriorityQueue与最小堆有何不同?

来自Java文档表示为平衡二进制堆的优先级队列:queue [n]的两个子级是queue [2 * n 1]和queue [2 *(n 1)]。 优先级队列由比较器或元素的自然顺序进行排序。这是使用PriorityQueue的最大堆和最小堆的工作代码-class HeapDemo {private final static int HEAP_SIZE …

deepin安装java_Deepin安装Eclipse

Deepin安装Eclipse系统环境:Deepin 15.5软件环境:Eclipse 4.7官网下载最新版elipse(4.7)安装板或压缩版均启动失败(弹框报错),原因是deepin默认安装的openjdk1.9的版本,而eclipse支持的最低版本为jdk1.8版本,本机又需要jdk1.7版本的,因此需要修改eclipse启动vm参数才…

java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务

java项目中如何利用多线程实现一个定时器任务发布时间:2020-11-10 16:04:03来源:亿速云阅读:86作者:Leah今天就跟大家聊聊有关java项目中如何利用多线程实现一个定时器任务,可能很多人都不太了解,为了让大家…

简述java在安卓开发中的应用_Java 自定义注解在安卓开发中的简单运用

定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、接口、枚举、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说…

java数组个数无限_基于Java代码实现数字在数组中出现次数超过一半

下文通过几种方法给大家介绍java数组数字出现次数,具体内容如下所示:方法一:数组排序,然后中间值肯定是要查找的值。 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历。方法二:使用散列表的方式&#xff…

java合并sheet行_java poi Excel循环合并行

//Java poi 实现循环合并行,还是第一次遇到这种问题//在网上查了很多资料,都不是自己想要的//以下为自己研究后,写的一点东西,给大家分享,希望对大家能有思路上的启发,也希望大家能提出宝贵意见&#xff0c…

java类中自定义函数的调用_关于方法:自定义类中对函数的未解析引用

我无法解决看似微不足道的问题。我的问题可能是缺乏对Kotlin语言的经验(和理解)。不过,我将需要帮助。我做了一个自定义类,其中包含一个自定义函数。看起来很简单,但是当我尝试使用此功能时,我一直收到"未解决的引用"错…

java正则表达式 分词_[Java]使用正则表达式实现分词

手工分词稍嫌麻烦,不好维护,而利用正则表达式就利索多了。Java提供了java.util.regex.Matcher,java.util.regex.Pattern类来帮助我们实现此功能。例一:以下程序将把"This is a farm that that raises dairy cattle."中的…