如何替换/加速使用LIKE的文本搜索查询?

时间:2010-12-20 19:07:41

标签: php mysql full-text-search

我正在努力加快查询......

select PadID from Pads WHERE (keywords like '%$search%' or 
ProgramName like '%$search%' or English45 like '%$search%') AND 
RemovemeDate = '2001-01-01 00:00:00' ORDER BY VersionAddDate DESC

我已经完成了一些工作,我有一个关键字表,所以我可以添加

... PadID IN (SELECT PadID FROM Keywords WHERE word = '$search') ...

然而,将English45和ProgramName中的单词分成单词表将会是一场噩梦。

有什么想法吗? 编辑:(也提供了实际的表名)

alt text

alt text

alt text

3 个答案:

答案 0 :(得分:2)

您是否尝试过FULLTEXT索引?这是一篇很好的文章:

http://devzone.zend.com/article/1304

另外,请研究使用SOUNDEX函数,这可能有所帮助,但可能没有。

答案 1 :(得分:0)

朱,

您需要在查询中提供解释输出。类似的东西:

mysql> EXPLAIN select id from mytable WHERE (keywords like '%$search%' or ProgramName like '%$search%' or English45 like '%$search%') AND RemovemeDate = '2001-01-01 00:00:00' ORDER BY VersionAddDate DESC

如果可能的话,通过在表上执行DESC来构建表结构。这将有助于我们识别您的索引结构以及它们是否在查询中使用。

感谢。

答案 2 :(得分:0)

朱,

基于EXPLAIN输出,有几点需要注意:

  1. WHERE RemoveMeDate限制条款。
  2. ORDER BY正在对数据进行第二次传递以对其进行排序。请注意,VersionAddDate上没有索引。
  3. 索引的选择取决于您正在使用的所有其他查询,但对于此特定查询,我想为VersionAddDate添加索引。但是,由于MySQL只能对查询使​​用单个索引,因此索引将如下所示:

    INDEX `removemedate` (`RemoveMeDate` ASC, `VersionAddDate` ASC)
    

    执行此操作后,应该阅读以下内容:

    +----+-------------+-------+------+---------------+--------------+---------+--------------+-------------+
    | id | select_type | table | type | possible_keys | key          | key_len | ref   | rows | Extra       |
    +----+-------------+-------+------+---------------+--------------+---------+-------+------+-------------+
    |  1 | SIMPLE      | pads  | ref  | removemedate  | removemedate | 4       | const |    1 | Using where |
    +----+-------------+-------+------+---------------+--------------+---------+-------+------+-------------+
    

    请注意,Extra下的filesort已消失。这应该比您之前的查询提供更好的性能。

    感谢。