MySQL/PHP搜索效率

wil*_*amg 8 php mysql performance search

我正在尝试为我的网站创建一个小搜索.我尝试过使用全文索引搜索,但我永远无法使用它.这是我提出的:

if(isset($_GET['search'])) {

$search = str_replace('-', ' ', $_GET['search']);
$result = array();

$titles = mysql_query("SELECT title FROM Entries WHERE title LIKE '%$search%'");
while($row = mysql_fetch_assoc($titles)) {
    $result[] = $row['title'];
}

$tags = mysql_query("SELECT title FROM Entries WHERE tags LIKE '%$search%'");
while($row = mysql_fetch_assoc($tags)) {
    $result[] = $row['title'];
}

$text = mysql_query("SELECT title FROM Entries WHERE entry LIKE '%$search%'");
while($row = mysql_fetch_assoc($text)) {
    $result[] = $row['title'];
}

$result = array_unique($result);
}
Run Code Online (Sandbox Code Playgroud)

基本上,它会搜索数据库中所有条目的所有标题,正文和标签.这种方法效果不错,但我只是想知道它的效率如何?这也仅适用于小型博客.无论哪种方式,我只是想知道这是否可以提高效率.

Bil*_*win 22

没有办法提高LIKE '%pattern%'查询效率.一旦获得大量数据,使用这些通配符查询的速度比使用全文索引解决方案慢几百或几千倍.

您应该看看我为MySQL大学所做的演示:http: //www.slideshare.net/billkarwin/practical-full-text-search-with-my-sql

以下是如何使其工作:

  1. 首先确保您的表使用MyISAM存储引擎.MySQL FULLTEXT索引仅支持MyISAM表.(编辑11/1/2012: MySQL 5.6为InnoDB表引入了一个FULLTEXT索引类型.)

    ALTER TABLE Entries ENGINE=MyISAM;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建全文索引.

    CREATE FULLTEXT INDEX searchindex ON Entries(title, tags, entry);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 搜索一下!

    $search = mysql_real_escape_string($search);
    $titles = mysql_query("SELECT title FROM Entries 
        WHERE MATCH(title, tags, entry) AGAINST('$search')");
    while($row = mysql_fetch_assoc($titles)) {
        $result[] = $row['title'];
    }
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,您在MATCH子句中命名的列必须与您在全文索引定义中声明的列的顺序相同.否则它将无法工作.


我已经尝试过使用全文索引搜索,但我永远无法让它工作......我只是想知道这是否可以更高效.

这就像是在说:"我无法弄清楚如何使用这种电锯,所以我决定用小折刀砍下这棵红木树.我怎么能像电锯那样做这个工作呢?"


关于您搜索匹配超过50%的行的单词的评论.

MySQL手册说这个:

需要绕过50%限制的用户可以使用布尔搜索模式; 请参见第11.8.2节"布尔全文搜索".

:

自然语言搜索的50%阈值由所选择的特定加权方案确定.要禁用它,请在storage/myisam/ftdefs.h中查找以下行:

#define GWS_IN_USE GWS_PROB

将该行更改为:

#define GWS_IN_USE GWS_FREQ

然后重新编译MySQL.在这种情况下,无需重建索引.

此外,您可能正在搜索停用词.这些是全文搜索忽略的词,因为它们太常见了.单词如"the"等.请参阅http://dev.mysql.com/doc/refman/5.1/en/fulltext-stopwords.html


Mit*_*sey 5

使用LIKE不是全文.

您需要使用... WHERE MATCH(column) AGAINST('the query')才能访问全文搜索.