最近发现蝉知的全文检索不是用的第三方类似于sphinx或xunsearch这样的全文检索组件,所以我本着好奇心测试了一下它的效率...
测试结果就不说了,主要说下折腾这1000万测试数据的过程
MySQL存储过程的创建
DELIMITER //
CREATE PROCEDURE myproc(OUT s int)
BEGIN
SELECT COUNT(*) INTO s FROM students;
END
//
DELIMITER;
具体使用网上找找资料吧,还是比较多的。
批量插入100万条测试数据
mysql> delimiter $$$
mysql> create procedure search()
-> begin
-> declare i int default 0;
-> set i=0;
-> start transaction;
-> while i<1000000 do
-> INSERT INTO `zt_searchindex` ( `objectType`, `objectID`, `title`, `content`, `addedDate`, `editedDate`) VALUES ('task', 35, ' 25968 21488', ' 25968 25454 24211', '2017-11-17 15:44:23', '2017-11-17 15:44:23');
-> set i=i+1;
-> end while;
-> commit;
-> end
-> $$$
mysql> delimiter;
其中INSERT INTO
这一段根据自己的需求处理,我是给它加了一堆的一样的,内容比较长,这儿缩短了...
跑起来
call search();
用了9分钟... 好像还可以接受,但是其它有点慢。
适当的优化一下
- 设置 innodb_flush_log_at_trx_commit = 0 ,相对于 innodb_flush_log_at_trx_commit = 1 可以十分明显的提升导入速度;
- 使用 load data local infile 提速明显;
- 修改参数 bulk_insert_buffer_size, 调大批量插入的缓存;
- 合并多条 insert 为一条.
Myisam : 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据。 ALTER TABLE tblname DISABLE KEYS;
loading the data ALTER TABLE tblname ENABLE KEYS;
这两个命令用来打开或者关闭Myisam表非唯一索引的更新。在导入大量的数据到一个非空的Myisam表时,通过设置这两个命令,可以提高导入的效率。对于导入大量数据到一个空的Myisam表,默认就是先导入数据然后才创建索引的,所以不用进行设置
Innodb : 对于Innodb类型的表,有以下几种方式可以提高导入的效率:
①因为Innodb类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺序排列,可以有效的提高导入数据的效率。如果Innodb表没有主键,那么系统会默认创建一个内部列作为主键,所以如果可以给表创建一个主键,将可以利用这个优势提高导入数据的效率。
②在导入数据前执行SET UNIQUE_CHECKS=0
,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1
,恢复唯一性校验,可以提高导入的效率。
③如果应用使用自动提交的方式,建议在导入前执行SET AUTOCOMMIT=0
,关闭自动提交,导入结束后再执行SET AUTOCOMMIT=1
,打开自动提交,也可以提高导入的效率。
而我创建的是Innodb类型的表
所以稍微修改了一下
mysql> set session UNIQUE_CHECKS off;
mysql> set session AUTOCOMMIT off;
这样之后,我提交100万的数据就只用了差不多120秒左右...
然后我们将数据量改成了 1000万. 差不多 10分钟就跑完了。。。
至于蝉知的搜索情况,我就不多说了,有兴趣的可以试试...