mysql全文索引 很慢,速度不如like的百分之一

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql全文索引 很慢,速度不如like的百分之一相关的知识,希望对你有一定的参考价值。

我遇到的问题就是,mysql的全文索引特别慢,无论是查询还是删除,
删除127条用207秒。
数据量是10W,每条记录的字段不是很大。整个数据库一共230M。
是本机的 mysql

这个是数据表的结构

这个是建的索引

这是两个sql语句

第一个sql的信息

第二个sql的信息

下面是执行的时间,依次是第一个和第二个

从explain开始说起吧,很显然第一个sql语句压根没用任何索引(key列内什么都没有)!第二个倒是用到索引,却是主键索引,并非你添加的fulltext索引!

接下来,分析下原因:
sql1:执行步骤:先s_a和s_a_t两表笛卡尔集,然后筛选满足on条件的,接着在从结果集中筛选满足where字句的;该过程中处理的记录条目为69*105479,并且未用到任何索引,未用到的原因可能是你先定义了一个复合索引a_concent_split(a_title_split,a_content_split),然后又定义了一个a_content_split2(a_content_split),当引擎执行查找优化时候会先用到a_content_split,可是又由于复合索引是从最左边开始(不能跳过第一个字段),而你却忽略了a_title_split字段,故未能正常使用索引。
sql2:执行步骤:先调用where字句对s_a表进行筛选形成新的s_a表,然后与s_a_t表笛卡尔积,再利用on字句筛选,最后再次利用where字句形成最终结果集;经过第一个where,该过程处理结果集会大幅少于sql1,并且该过程还用到了主键索引。你所设置的fulltext索引再次没有用到,原因是like字句中开始部分为模糊匹配%时候用不了全文索引,这与fulltext存储机制有关。

另,你说的删除速度慢,原因:设置fulltext字段设置太多,fulltext索引在更新删除大量数据时候,需要同步更改索引,你的三个fulltext压力太大!

改进方法:1、删除a_content_split索引重试 2、在删除时候打开delay_key_write变量

有关fulltext比较复杂,用的时候要谨慎设置,还有很多参数也对其有影响
另外sql语句中外连接有关on where字句也是个比较绕的地方,两者你都占了,唉,所以我写的略复杂,前天看到该问题,思忖两天这才作答

望有结果了予以回复交流!追问

好的,这个问题我放一下,明后天在处理,今天还有其他事情要做,
谢谢你,这事好歹有点眉路了,
结果一定告诉你

参考技术A 涉及到中文索引时,使用mysql自带的索引在对中文索引时会有瓶颈的 建议使用sphinx 等全文索引引擎,同时在查询时避免使用* 而使用具体的查询字段代替*, mysql的性能优化有很多中方式
对数据库有大量数据的读写时,使用读写分离和数据库数据同步来实现数据的读和写

以上是关于mysql全文索引 很慢,速度不如like的百分之一的主要内容,如果未能解决你的问题,请参考以下文章

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

全文索引和搜索速度

sql server 全文检索 使用

利用lucene对mysql数据创建索引,提高全文检索速度

MySQL全文索引 FULLTEXT索引和like的区别

mysql 普通索引和全文索引的区别