mysql – 全文搜索结果在“FULLTEXT初始化”中花费了大量时间
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 全文搜索结果在“FULLTEXT初始化”中花费了大量时间,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3303字,纯文字阅读大概需要5分钟。
内容图文
![mysql – 全文搜索结果在“FULLTEXT初始化”中花费了大量时间](/upload/InfoBanner/zyjiaocheng/897/1343708b8ecb4384892def79357a1f14.jpg)
我目前正在尝试针对Stack Overflow评论的数据转储运行一些查询.这是架构的样子:
CREATE TABLE `socomments` (
`Id` int(11) NOT NULL,
`PostId` int(11) NOT NULL,
`Score` int(11) DEFAULT NULL,
`Text` varchar(600) NOT NULL,
`CreationDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`UserId` int(11) NOT NULL,
PRIMARY KEY (`Id`),
KEY `idx_socomments_PostId` (`PostId`),
KEY `CreationDate` (`CreationDate`),
FULLTEXT KEY `Text` (`Text`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
我对这个表运行了这个查询,它的运行速度非常慢(它确实有2900万行,但它有一个全文索引):
SELECT *
FROM socomments
WHERE MATCH (Text) AGAINST ('"fixed the post"' IN BOOLEAN MODE)
所以我对它进行了分析,结果如下:
|| Status || Duration ||
|| starting || 0.000058 ||
|| checking permissions || 0.000006 ||
|| Opening tables || 0.000014 ||
|| init || 0.000019 ||
|| System lock || 0.000006 ||
|| optimizing || 0.000007 ||
|| statistics || 0.000013 ||
|| preparing || 0.000005 ||
|| FULLTEXT initialization || 207.1112 ||
|| executing || 0.000009 ||
|| Sending data || 0.000856 ||
|| end || 0.000004 ||
|| query end || 0.000004 ||
|| closing tables || 0.000006 ||
|| freeing items || 0.000059 ||
|| logging slow query || 0.000037 ||
|| cleaning up || 0.000046 ||
如您所见,它在FULLTEXT初始化中花费了很长时间.这是正常的吗?如果没有,我该如何解决?
解决方法:
其他人发现这是一个麻烦的情况
> InnoDB Full-text Search in MySQL 5.6: Part 3, Performance
> InnoDB Fulltext Search WITH QUERY EXPANSION is very slow
> 2010年9月16日
> 5.0.51a,5.0.75,5.0 bzr
>状态:无反馈
> SELECT query hang in state FULLTEXT initialization
> 2014年10月17日
> MySQL 5.6.19
>状态:不会修复
自MySQL Documentation is very terse on this thread state年起
FULLTEXT initialization
The server is preparing to perform a natural-language full-text search.
你唯一的办法就是用更少的数据进行准备.怎么样 ?
建议#1
再看一下你的查询.它正在选择所有列.我会重构查询以仅从socomments中收集id列.然后,将这些检索到的id连接回socomments表.
SELECT B.* FROM
(SELECT id FROM socomments
WHERE MATCH (Text) AGAINST ('"fixed the post"' IN BOOLEAN MODE)) A
LEFT JOIN socomments B USING (id);
这可能会产生一个更丑陋的EXPLAIN计划,但我认为分析会变得更好.基本思想是:如果你有一个积极的FULLTEXT搜索,让它在FULLTEXT初始化阶段收集最少量的数据,从而减少时间.
我以前多次推荐这个
> 2012年5月14日:slow query with fulltext and left join
> 2012年3月18日:Why is LIKE more than 4x faster than MATCH…AGAINST on a FULLTEXT index in MySQL?
> 2012年1月26日:Mysql fulltext search my.cnf optimization:
> 2011年10月25日:FULLTEXT index ignored in BOOLEAN MODE with ‘number of words’ conditional
建议#2
请确保您设置的是基于InnoDB的FULLTEXT选项,而不是MyISAM的选项.你应该关注的两个选择是
> Def Value 8000000(7.629M)
>最大值80000000(76.29M)
> Def Value 640000000(610M)
>最大值1600000000(1525M = 1.49G)
想一想.文本字段是VARCHAR(600).假设平均值为300字节.你有29,000,000,000.那将是8GB的一点点.也许增加innodb_ft_cache_size和innodb_ft_total_cache_size也可能有所帮助.
确保有足够的RAM用于较大的InnoDB FULLTEXT缓冲区.
试试看 !!!
内容总结
以上是互联网集市为您收集整理的mysql – 全文搜索结果在“FULLTEXT初始化”中花费了大量时间全部内容,希望文章能够帮你解决mysql – 全文搜索结果在“FULLTEXT初始化”中花费了大量时间所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。