繁体   English   中英

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

[英]How can I replace/speed up a text search query which uses LIKE?

我正在尝试加快查询速度...

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的单词拆分成单词表将是一场噩梦。

有任何想法吗 ? 编辑:(还提供了实际的表名)

替代文字

替代文字

替代文字

你试过FULLTEXT索引吗? 这是一篇很好的文章:

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

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

朱尔斯,

您需要提供查询的解释输出。 就像是:

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来构造表。 这将有助于我们识别您的索引结构以及它们是否在查询中使用。

谢谢。

朱尔斯,

根据EXPLAIN输出,有几件事需要注意:

  1. 在哪里RemoveMeDate约束该子句。
  2. ORDER BY正在对数据进行第二次传递以对其进行排序。 请注意,VersionAddDate上没有索引。

索引的选择取决于您正在使用的所有其他查询,但对于此特定查询,我想为VersionAddDate添加索引。 但是,由于MySQL只能对查询使​​用单个索引,因此索引如下所示:

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

完成此操作后,EXPLAIN应该显示为:

+----+-------------+-------+------+---------------+--------------+---------+--------------+-------------+
| 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已消失。 这应该比以前的查询提供更好的性能。

谢谢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM