MySQL全文索引、联合索引、like查询、json查询速度哪个快
查询背景
有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outline,存了一对多关系(保存了多个编码,例如jy1577683381775)
我们需要在这10万条数据中检索特定类型的数据,目标总数据量:2931条
SELECTCOUNT(*)FROMtmp_test_courseWHERE`type`=5ANDdel=2ANDis_leaf=1
jy1577683381775
jy1577683380808
jy1577683379178
jy1577683378676
jy1577683377617
jy1577683376672
jy1577683375903
jy1578385720787
jy1499916986208
jy1499917112460
jy1499917093400
jy1499917335579
jy1499917334770
jy1499917333339
jy1499917331557
jy1499917330833
jy1499917329615
jy1499917328496
jy1576922006950
jy1499916993558
jy1499916992308
jy1499917003454
jy1499917002952
下面分别列出4种方式查询outline字段,给出相应的查询时间和扫描行数
一、like查询
耗时248毫秒
SELECT*FROMtmp_test_course WHERE`type`=5ANDdel=2ANDis_leaf=1 AND( outlinelike'%jy1577683381775%' ORoutlinelike'%jy1577683380808%' ORoutlinelike'%jy1577683379178%' ORoutlinelike'%jy1577683378676%' ORoutlinelike'%jy1577683377617%' ORoutlinelike'%jy1577683376672%' ORoutlinelike'%jy1577683375903%' ORoutlinelike'%jy1578385720787%' ORoutlinelike'%jy1499916986208%' ORoutlinelike'%jy1499917112460%' ORoutlinelike'%jy1499917093400%' ORoutlinelike'%jy1499917335579%' ORoutlinelike'%jy1499917334770%' ORoutlinelike'%jy1499917333339%' ORoutlinelike'%jy1499917331557%' ORoutlinelike'%jy1499917330833%' ORoutlinelike'%jy1499917329615%' ORoutlinelike'%jy1499917328496%' ORoutlinelike'%jy1576922006950%' ORoutlinelike'%jy1499916993558%' ORoutlinelike'%jy1499916992308%' ORoutlinelike'%jy1499917003454%' ORoutlinelike'%jy1499917002952%' )
EXPLAIN分析结果如下,全表扫描
二、json函数查询
json官方函数
耗时196毫秒,速度稍微快了一点
SELECT*FROMtmp_test_course WHERE`type`=5ANDdel=2ANDis_leaf=1 AND ( JSON_SEARCH(outline,'one','jy1577683381775')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1577683380808')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1577683379178')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1577683378676')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1577683377617')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1577683376672')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1577683375903')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1578385720787')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499916986208')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499917112460')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499917093400')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499917335579')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499917334770')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499917333339')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499917331557')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499917330833')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499917329615')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499917328496')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1576922006950')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499916993558')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499916992308')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499917003454')ISNOTNULLOR JSON_SEARCH(outline,'one','jy1499917002952')ISNOTNULL )
EXPLAIN分析结果如下,还是全表扫描
三、联合索引查询
下面为该表建立一个联合索引(本来想建一个type-del-is_leaf-outline的索引,但是outline字段太长限制,所以只加type-del-is_leaf的联合索引
ALTERTABLEtmp_test_courseADDKEY`type-del-is_leaf`(`type`,`del`,`is_leaf`)
加入索引后再执行like和json查询,明显提速。
like执行用了136毫秒,json查询用了82.6毫秒,由此可见针对json类型使用json函数查询比like快
EXPLAIN分析结果如下,两者查询扫描的行数都限定在了2931行
四、全文索引查询
因为全文索引只支持CHAR、VARCHAR和TEXT,我们需要把JSON字段定义改一下
ALTERTABLEtmp_test_courseMODIFY`outline`VARCHAR(1024)NOTNULLDEFAULT'[]'
添加全文索引
ALTERTABLEtmp_test_courseADDFULLTEXTINDEXoutline(outline);
现在再来用全文索引进行检索
SELECT*FROMtmp_test_course WHERE`type`=5ANDdel=2ANDis_leaf=1 AND MATCH(outline)AGAINST('jy1577683381775jy1577683380808jy1577683379178jy1577683378676jy1577683377617jy1577683376672jy1577683375903jy1578385720787jy1499916986208jy1499917112460jy1499917093400jy1499917335579jy1499917334770jy1499917333339jy1499917331557jy1499917330833jy1499917329615jy1499917328496jy1576922006950jy1499916993558jy1499916992308jy1499917003454jy1499917002952')
耗时11.6毫秒,速度提升极其明显,可见全文索引的牛逼。
EXPLAIN分析结果如下,显示只扫描了一行
结论
以下是4种情况的执行结果
全文索引:11.6ms
联合索引:82.6ms(json)、136ms(like)
json函数查询:196ms
like查询:248ms
结论:全文索引>联合索引>json函数查询>like查询
数据量越大,全文索引速度越明显,就10万的量,查询速度大概比直接查询快了20倍左右,如果是百万或千万级别的表,提升差距会更加大,所以有条件还是老老实实用全文索引吧
到此这篇关于MySQL全文索引、联合索引、like查询、json查询速度哪个快的文章就介绍到这了,更多相关mysql全文索引联合索引like查询json查询内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。