优化mysql全文搜索

时间:2011-05-20 11:04:16

标签: php mysql full-text-search

我想在我的网站上使用全文搜索。我需要一个分页搜索。我的数据库每桌有50,000多行。我改变了我的表并使(title,content,date)成为索引。表总是更新,仍然有一个自动增加的列id。最新的date总是在表的末尾。

date  varchar(10)
title  text
content  text

但整个查询时间将花费1.5+ seconds。我通过谷歌搜索了很多文章,有人写道,只有限制Index字段字长才能更快地帮助搜索。但作为text类型,它can not会改变一定的长度(我已尝试ALTER TABLE table_1 CHANGE标题标题TEXT(500) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,而不是工作)

date  varchar(10)
title  text(500)
content  text(1000)

所以,除了Sphinx和第三部分脚本。如何用sql优化全文搜索?查询代码:

(SELECT 
title,content,date 
FROM table_1 
WHERE MATCH (title,content,date) 
AGAINST ('+$Search' IN BOOLEAN MODE)) 
UNION 
(SELECT 
title,content,date 
FROM table_2 
WHERE MATCH (title,content,date) 
AGAINST ('+$Search' IN BOOLEAN MODE)) 
Order By date DESC

感谢。

3 个答案:

答案 0 :(得分:10)

根据问题的后续评论,您的列上有btree索引而不是全文索引。

对于针对搜索的MATCH(标题,内容),您需要:

CREATE FULLTEXT INDEX index_name ON tbl_name (title,content);

我不确定它会接受那里的日期字段(后者可能无论如何都不相关)。

答案 1 :(得分:6)

我有一个全面的计划让您尽可能彻底地优化MySQL以进行FULLTEXT索引

您应该做的第一件事是:摆脱禁用词列表

多年来,由于不了解over 600 words are excluded from a FULLTEXT index,这让一些人感到恼火。

Here is tabular view of those stopwords

有两种方法可以绕过这个

绕过选项1)创建自定义禁用词列表。

您实际上可以向mysql提交您首选的停用词列表。这是默认值:

mysql> show variables like 'ft%';
+--------------------------+----------------+
| Variable_name            | Value          |
+--------------------------+----------------+
| ft_boolean_syntax        | + -><()~*:""&| |
| ft_max_word_len          | 84             |
| ft_min_word_len          | 4              |
| ft_query_expansion_limit | 20             |
| ft_stopword_file         | (built-in)     |
+--------------------------+----------------+
5 rows in set (0.00 sec)

好的,不要让我们创建我们的禁用词列表。我通常将英文文章设置为唯一的停用词。

echo "a"    > /var/lib/mysql/stopwords.txt
echo "an"  >> /var/lib/mysql/stopwords.txt
echo "the" >> /var/lib/mysql/stopwords.txt

接下来,将选项添加到/etc/my.cnf并允许使用1个字母,2个字母和3个字母的单词

[mysqld]
ft_min_word_len=1
ft_stopword_file=/var/lib/mysql/stopwords.txt

最后,重新启动mysql

service mysql restart

如果您有任何已有FULLTEXT索引的表,则必须删除这些FULLTEXT索引并再次创建它们。

绕过选项2)重新编译源代码

文件名为storage / myisam / ft_static.c。只需改变容纳600多个单词的C结构,使其为空。玩得开心重新编译!!!

现在FULLTEXT配置已经固化,这是另一个需要考虑的主要方面:

编写正确的重构查询,以便MySQL查询优化工具正常工作!!!

我现在提到的内容实际上是未记录的:每当执行执行JOIN的查询并且WHERE子句包含用于FULLTEXT搜索的MATCH函数时,它往往会导致MySQL查询优化器将查询视为全表扫描来搜索FULLTEXT索引中的invoved列。如果您计划使用FULLTEXT索引查询表ALWAYS refactor your query to have the FULLTEXT search return only keys in a subquery and connect those keys to your main table。否则,FULLTEXT索引将使MySQL查询优化器陷入混乱。

答案 2 :(得分:1)

有关MySQL中全文搜索优化的进一步想法,请参阅How to optimize MySQL Boolean Full-Text Search? (Or what to replace it with?) - C#