我想在我的网站上使用全文搜索。我需要一个分页搜索。我的数据库每桌有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
感谢。
答案 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#