首先 来建立一张带有FULLTEXT索引测试表 建表语句: html
在插入数据以前,咱们首先看一下当前数据库所在的环境:数据库
show global variables like 'innodb_buffer_pool_size'; #缓冲池总大小安全
show global variables like 'innodb_buffer_pool_instances'; #缓冲池的数量架构
可见测试环境music库缓冲池128M,缓冲池有8个。并发
缓冲池用来弥补CPU和磁盘IO之间的鸿沟,在写入数据的时候,首先修改缓冲池中的页(页是InnoDB存储引擎最小的管理单位),再以必定的频率刷新到磁盘上,而多个缓冲池能够减小数据库内部的资源竞争,增长数据库的并发处理能力,所以缓冲池总大小和缓冲池数量都是决定数据库处理性能的重要指标。这里能够扩大缓冲池size来提高插入速度,因为是公共的测试环境,因此这里不作修改。elasticsearch
innodb_flush_log_at_trx_commit :redo日志刷新到磁盘的策略,默认为1,即每次事务提交,都刷入到磁盘中。这是安全系数最高的同步策略,可是在大量数据插入时,会由于频繁的磁盘IO操做,大大影响插入速度。性能
sync_binlog:二进制日志刷到磁盘的策略,默认是0,也就是不开启二进制日志,但在不少主从数据库架构中,这个参数都是大于0的。打开这个参数,也会大大影响插入速度。测试
写一个批量插入的存储过程:优化
而后调用存储过程:3d
当查询含有100008这个字段的信息时,用like查询:
缘由是,like查询前10条的时候,是采用全表扫描的方式,一直查找满10条的时候,就会返回数据。而回顾一下1.3中的存储过程,能够看到100008这个字段的命中率大约是33%,至关于,全表扫描到30条的时候,就已经拿到足够的数据返回了。
可是当查询第1000000到1000010条时,因为要扫描大约3百万条数据才能得到结果集,所以速度就很是慢了:
为了验证这个观点,我往t_song_info_test_test表中插入两条数据
此时,200008在1千万+2条数据中总共只出现了两次。此时,执行查询语句:
长度小于4的字段,不会被记录到全文检索中,也就查不到结果
全文检索是根据空格符或者“,”这类的明显的分隔符字段来分词的。并不想elasticsearch那样支持中文分词,可是从MySQL 5.7.6开始,内置的InnoDB支持自定义分词长度对中文进行分词,能够参考[www.jianshu.com/p/c48106149…](MySQL 5.7 中文全文检索使用教程)。