InnoDB大数据插入的优化和FULLTEXT索引性能优化的调研

栏目: 数据库 · 发布时间: 5年前

内容简介:FULLTEXT索引加在了vivo_tags字段上,关于FULLTEXT索引的介绍可以参考《MySQL技术内幕——InnoDB存储引擎》的P229~P248,也可以参考https://www.cnblogs.com/tommy-huang/p/4483684.html在插入数据之前,我们首先看一下当前数据库所在的环境:show global variables like 'innodb_buffer_pool_size'; #缓冲池总大小

FULLTEXT索引加在了vivo_tags字段上,关于FULLTEXT索引的介绍可以参考《MySQL技术内幕——InnoDB存储引擎》的P229~P248,也可以参考https://www.cnblogs.com/tommy-huang/p/4483684.html

在插入数据之前,我们首先看一下当前数据库所在的环境:

show global variables like 'innodb_buffer_pool_size'; #缓冲池总大小

InnoDB大数据插入的优化和FULLTEXT索引性能优化的调研

show global variables like 'innodb_buffer_pool_instances'; #缓冲池的数量

InnoDB大数据插入的优化和FULLTEXT索引性能优化的调研

可见测试环境music库缓冲池128M,缓冲池有8个。

缓冲池用来弥补CPU和磁盘IO之间的鸿沟,在写入数据的时候,首先修改缓冲池中的页(页是InnoDB存储引擎最小的管理单位),再以一定的频率刷新到磁盘上,而多个缓冲池可以减少数据库内部的资源竞争,增加数据库的并发处理能力,因此缓冲池总大小和缓冲池数量都是决定数据库处理性能的重要指标。这里可以扩大缓冲池size来提升插入速度,由于是公共的测试环境,所以这里不做修改。

1.2.2 innodb_flush_log_at_trx_commit 和 sync_binlog

innodb_flush_log_at_trx_commit :redo日志刷新到磁盘的策略,默认为1,即每次事务提交,都刷入到磁盘中。这是安全系数最高的同步策略,但是在大量数据插入时,会因为频繁的磁盘IO操作,大大影响插入速度。

sync_binlog:二进制日志刷到磁盘的策略,默认是0,也就是不开启二进制日志,但在很多主从数据库架构中,这个参数都是大于0的。打开这个参数,也会大大影响插入速度。

1.3插入数据

写一个批量插入的存储过程:

InnoDB大数据插入的优化和FULLTEXT索引性能优化的调研

这里手动开启了一个事务,手动控制每一万条插入数据提交一次。这是因为,在默认条件下,插入操作每进行一次,就自动提交一次,如果插入1000万条,就提交了1000万次,这无疑是很崩溃的。但是这个10000次插入操作提交一次,也没有经过严格验证,是否就是最好的选择,因为这和缓冲池大小有关系,如果插入10000条时,缓冲池已经满了,也会强制刷入磁盘中,而如果缓冲池太大,10000次又显得太少了。实际这边可以加一个记录表,记录每一次提交的成功与否情况,可以帮助我们实时监控插入操作进行到哪里进行得怎样了,毕竟1000万条的插入还是相当漫长的。

然后调用存储过程:

InnoDB大数据插入的优化和FULLTEXT索引性能优化的调研

实测用了大概28分钟。

2.全文索引

当查询含有100008这个字段的信息时,用like查询:

InnoDB大数据插入的优化和FULLTEXT索引性能优化的调研

用全文检索查询:

InnoDB大数据插入的优化和FULLTEXT索引性能优化的调研

奇怪,怎么全文检索反而慢呢?

原因是,like查询前10条的时候,是采用全表扫描的方式,一直查找满10条的时候,就会返回数据。而回顾一下1.3中的存储过程,可以看到100008这个字段的命中率大约是33%,相当于,全表扫描到30条的时候,就已经拿到足够的数据返回了。

但是当查询第1000000到1000010条时,由于要扫描大约3百万条数据才能获得结果集,因此速度就非常慢了:

InnoDB大数据插入的优化和FULLTEXT索引性能优化的调研

而反观全文检索的查询方式,由于采用的是倒排索引的实现方式,先是把所有100008的所有倒排索引列出来,然后在这个集合里面取前10个,这里100008的文档数超过300万,因此速度就比较慢了。

为了验证这个观点,我往t_song_info_test_test表中插入两条数据

InnoDB大数据插入的优化和FULLTEXT索引性能优化的调研

此时,200008在1千万+2条数据中总共只出现了两次。此时,执行查询语句:

InnoDB大数据插入的优化和FULLTEXT索引性能优化的调研

只花了0.047秒。

3.注意点

3.1全文检索的默认最小长度是4

长度小于4的字段,不会被记录到全文检索中,也就查不到结果

InnoDB大数据插入的优化和FULLTEXT索引性能优化的调研

修改ft_min_word_len的值即可。

3.2分词并不智能

全文检索是根据空格符或者“,”这类的明显的分隔符字段来分词的。并不想elasticsearch那样支持中文分词,但是从 MySQL 5.7.6开始,内置的InnoDB支持自定义分词长度对中文进行分词,可以参考[ www.jianshu.com/p/c48106149… ](MySQL 5.7 中文全文检索使用教程)。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

逻辑的引擎

逻辑的引擎

[美] 马丁·戴维斯 / 张卜天 / 湖南科学技术出版社 / 2005-5 / 20.00元

本书介绍了现代计算机背后的那些基本概念和发展这些概念的人,描写了莱布尼茨、布尔、费雷格、康托尔、希尔伯特、哥德尔、图灵等天才的生活和工作,讲述了数学家们如何在成果付诸应用之前很久就已经提出了其背后的思想。博达著作权代理有限公司授权出版据美国W.W.Norton公司2000年版本译出。2007年第二版亦使用同一ISBN。一起来看看 《逻辑的引擎》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码