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

查询背景

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

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

2931

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

8a4029b605f07808d27d885fd333dca2.png

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

jy1577683381775jy1577683380808jy1577683379178jy1577683378676jy1577683377617jy1577683376672jy1577683375903jy1578385720787jy1499916986208jy1499917112460jy1499917093400jy1499917335579jy1499917334770jy1499917333339jy1499917331557jy1499917330833jy1499917329615jy1499917328496jy1576922006950jy1499916993558jy1499916992308jy1499917003454jy1499917002952

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

一、like查询

耗时248毫秒

SELECT * FROM tmp_test_course WHERE `type`=5 AND del=2 AND is_leaf=1 AND (outline like '%jy1577683381775%'OR outline like '%jy1577683380808%'OR outline like '%jy1577683379178%'OR outline like '%jy1577683378676%'OR outline like '%jy1577683377617%'OR outline like '%jy1577683376672%'OR outline like '%jy1577683375903%'OR outline like '%jy1578385720787%'OR outline like '%jy1499916986208%'OR outline like '%jy1499917112460%'OR outline like '%jy1499917093400%'OR outline like '%jy1499917335579%'OR outline like '%jy1499917334770%'OR outline like '%jy1499917333339%'OR outline like '%jy1499917331557%'OR outline like '%jy1499917330833%'OR outline like '%jy1499917329615%'OR outline like '%jy1499917328496%'OR outline like '%jy1576922006950%'OR outline like '%jy1499916993558%'OR outline like '%jy1499916992308%'OR outline like '%jy1499917003454%'OR outline like '%jy1499917002952%')

49a41b8b2fc5239add82c29763edb6ad.png

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

f31b0ee8e0a214d5ba09d69ca2547938.png

二、json函数查询

使用函数JSON_SEARCH,更多函数请查看MySQL官方文档

可以看到,查询耗时196毫秒,速度稍微快了一点

SELECT * FROM tmp_test_course WHERE `type`=5 AND del=2 AND is_leaf=1AND (JSON_SEARCH(outline, 'one', 'jy1577683381775') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1577683380808') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1577683379178') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1577683378676') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1577683377617') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1577683376672') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1577683375903') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1578385720787') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499916986208') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499917112460') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499917093400') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499917335579') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499917334770') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499917333339') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499917331557') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499917330833') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499917329615') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499917328496') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1576922006950') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499916993558') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499916992308') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499917003454') IS NOT NULL ORJSON_SEARCH(outline, 'one', 'jy1499917002952') IS NOT NULL )

aa458aa86d0df01686cc456bc2090b01.png

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

da1c983a4920891bbb5f203cf1bff10f.png

三、联合索引查询

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

ALTER TABLE tmp_test_course ADD KEY `type-del-is_leaf` (`type`,`del`,`is_leaf`)

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

like执行用了136毫秒,json查询用了82.6毫秒,由此可见针对json类型使用json函数查询比like快

7549c6cb3ae6a297d11229eb370caaa2.png

45576f7b015555f64ced4b1f575ea932.png

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

4dba7826f947fe3deff5c7804510141a.png

1ec240eaf64f3323172700cd3068b3e8.png

四、全文索引查询

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

ALTER TABLE tmp_test_course MODIFY `outline` VARCHAR(1024) NOT NULL DEFAULT '[]'

ALTER TABLE tmp_test_course ADD FULLTEXT INDEX outline (outline);

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

SELECT * FROM tmp_test_course WHERE `type`=5 AND del=2 AND is_leaf=1AND MATCH(outline) AGAINST ('jy1577683381775 jy1577683380808 jy1577683379178 jy1577683378676 jy1577683377617 jy1577683376672 jy1577683375903 jy1578385720787 jy1499916986208 jy1499917112460 jy1499917093400 jy1499917335579 jy1499917334770 jy1499917333339 jy1499917331557 jy1499917330833 jy1499917329615 jy1499917328496 jy1576922006950 jy1499916993558 jy1499916992308 jy1499917003454 jy1499917002952')

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

980298b43f6dacccc8e1255f1724ac02.png

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

555ffd7863a4ed6aa16e44e7af882488.png

结论

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

结论:全文索引 > 联合索引 > json函数查询 > like查询

数据量越大,全文索引速度越明显,就10万的量,查询速度大概比直接查询快了20倍左右,如果是百万或千万级别的表,提升差距会更加大,所以有条件还是老老实实用全文索引吧

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

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

相关文章

java从端口获取数据库_Java之通过接口获取数据并用JDBC存储到数据库中

最近做数据同步功能,从接口获取数据然后存到数据库中以便后续对数据进行相关操作,下面就贴一下相关代码。1 import com.alibaba.fastjson.JSON;2 import com.alibaba.fastjson.JSONObject;34 public class Digests {5 private static final String APPKE…

支付宝H5 与网页端支付开发

在日常生活中,我们基本上都是进行微信与支付宝的支付方式尽心支付,这种方式确实大大便利了我们的生活,那么如何在我们的产品中进行微信与支付宝支付的植入开发呢? 我们先进行支付宝的H5与网页端支付开发,这里只进行支付…

C/C++中extern关键字详解

1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C"…

javaone_JavaOne 2012:NetBeans.Next –未来路线图

javaone我从Continental Ballroom 4和一个NetBeans主题( Easel项目 )到Continental Ballroom 5,走了必要的几个步骤,以查看另一个面向NetBeans的演示文稿:“ NetBeans.Next –未来路线图”。 Ashwin Rao着手介绍羽毛之…

java简单编译器源代码_25行代码实现一个简单的编译器

起因《25行JavaScript语句实现一个简单的编译器》实现的是一个简单到不能再简单的玩具的玩具,他的魔法是函数式编程简化了js代码。java 8提供了函数式编程的支持,昨晚脑子抽风突然兴趣java也可以实现一个如此简单的编译器!java和js语言差异ja…

《python网络数据采集》读后感 第六章:读取文档

1.文档编码: 文档编码是一种告诉程序——无论是计算机的操作系统还是 Python 代码——读取文档的规 则。文档编码的方式通常可以根据文件的扩展名进行判断,虽然文件扩展名并不是由编码 确定的,而是由开发者确定的。例如,如果我把 …

如何在Gradle多项目构建中管理依赖项

从很早以前我就一直喜欢Gradle构建工具。 它的潜力甚至在1.0版本之前就已经很明显了,那时变化经常被打破。 如今,升级很少会引起意外。 该工具已经成熟并且运行良好。 Gradle包括一个功能强大的依赖项管理系统,该系统可以与Maven和Ivy存储库…

Linux下nm和ldd 命令

1. Linux nm 命令 nm [‘-a’|‘--debug-syms’] [‘-g’|‘--extern-only’] [‘-B’] [‘-C’|‘--demangle’[style]] [‘-D’|‘--dynamic’] [‘-S’|‘--print-size’] [‘-s’|‘--print-armap’] [‘-A’|‘-o’|‘--print-file-name’][‘--special-syms’] [‘-n’|‘…

mysql alter table_mysql ALTER TABLE 的用法

在表格被建立在资料库中后,我们常常会发现,这个表格的结构需要有所改变。常见的改变如下:加一个栏位删去一个栏位改变栏位名称改变栏位的资料种类以上列出的改变并不是所有可能的改变。ALTER TABLE 也可以被用来作其他的改变,例如…

WEB开发技术点

做为一个WEb类MIS的开发者,涉及的知识点很多,总结成图,方便自已学习 转载于:https://www.cnblogs.com/ezezwyj/p/9515859.html

mysql8中怎么增删一列_MYSQL 第八课 数据的增删改

#DML语言/*数据操作语言:插入:insert修改:update删除:delete*/#一、插入语句#方式一:经典的插入/*语法:insert into 表名(列名,...) values(值1,...);*/SELECT * FROM beauty;#1.插入的值的类型要与列的类型…

c++中new和delete的使用方法

new和delete运算符用于动态分配和撤销内存的运算符 new用法: 1. 开辟单变量地址空间 1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a new int 即为将一个int类型的地址赋值给整型指针a. 2)int *a new int(5) 作用同上,但是同时将整数赋…

学习笔记--Dubbo

Dubbo学习笔记 Dubbo是什么 Dubbo是: 一款分布式服务框架高性能和透明化的RPC远程服务调用方案SOA服务治理方案ZooKeeper服务注册中心 下载 ZooKeeper ,地址 http://www.apache.org/dyn/closer.cgi/zookeeper 解压,修改zoo_sample.cfg 重命名…

apache hive_通过6个简单的步骤在Windows上运行Apache Hive

apache hive注意 :您需要安装cygwin才能运行本教程,因为Hadoop(Hive所需)需要cygwin才能在Windows上运行。 至少,系统中必须存在Basic,Net(OpenSSH,tcp_wrapper软件包)和…

java remove(index)_方法removeElementAt(int index)在Java中做什么?

removeElementAt(INT指数)方法用于指定索引处删除的组件。该向量中具有大于或等于指定索引的索引的每个分量都向下移动,以使其索引比以前具有的值小一个,并且此向量的大小减小1。示例public class VectorDemo {public static void main(String[] args) {…

C++的营养

上一篇《C的营养——RAII》中介绍了RAII,以及如何在C#中实现。这次介绍另一个重要的基础技术——swap手法。swap手法 swap手法不应当是C独有的技术,很多语言都可以实现,并且从中得到好处。只是C存在的一些缺陷迫使大牛们发掘,并开…

git rm -r --cached 去掉已经托管在git上的文件

1.gitignore文件 在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改 .gitignore 文件的方法。这个文件每一行保存了一个匹配的规则例如: # 此为注释 – 将被 Git 忽略 *.a # 忽略所有 .a 结尾的文件 !l…

Gradle技巧–显示buildscript依赖项

在Gradle中如何显示和分析buildscript依赖项(例如插件)的简单方法 介绍 这是我的Gradle技巧迷你系列的第三部分,该系列与可视化和依赖性分析有关。 在第一篇文章中,我介绍了一种如何显示多项目构建中所有子项目的依赖关系的方法。…

Java购物车swing_JAVA课程设计--购物车

1.码云GIT提交2.设计思路1,使用数据库对购物车的数据进行处理2.分别使用sql语句来实现对购物车和商城物品的增删改查。3.代码package Main;import java.awt.BorderLayout;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JPanel;import j…

[python] 列表解析式的高效与简洁

方法一(列表解析式): list1 ["abc","efg","hij"] list2 [i[0] for i in list1] print list2方法二(普通写法): list1 ["abc","efg","hij"…