2010-06-28 82 views
3

我打算通过网站实现数据库搜索 - 我知道有全文搜索由mysql提供,但事实证明,它不支持innodb引擎(我需要交易支持)。 其他选项正在使用狮身人面像或类似的索引应用程序。但是,它们需要对数据库结构进行重新分解,并且可能需要比我更多的时间来实施。执行数据库搜索通过查询使用像

所以我决定采取每个表并将所有相关的列连接到一个新添加的QUERY列。这个查询列也应该从其他相关表的列中招募。

这样做,我将使用表中查询列上的'like'子句进行搜索,以返回特定域(相关表组)的结果。

由于我的数据库预计不会太大(<最大的表中有1行),所以我期待合理的查询时间。

有没有人同意这种方法或有更好的主意?

回答

6

对于使用LIKE和通配符的解决方案,您不会感到满意。它比使用全文搜索技术慢数百或数千倍。

看我的介绍Practical Full-Text Search in MySQL

我不建议将值复制到QUERY列中,而是将值复制到MyISAM表中并在其中定义FULLTEXT索引。你可以使用触发器来做到这一点。

您不需要将值连接在一起,只需要主键列和每个可搜索的文本列。

CREATE TABLE OriginalTable (
    original_id SERIAL PRIMARY KEY, 
    author_id INT, 
    author_date DATETIME, 
    summary TEXT, 
    body TEXT 
) ENGINE=InnoDB; 

CREATE TABLE SearchTable (
    original_id BIGINT UNSIGNED PRIMARY KEY, -- not auto-increment 
    -- author_id INT, 
    -- author_date DATETIME, 
    summary TEXT, 
    body TEXT, 
    FULLTEXT KEY (summary, body) 
) ENGINE=MyISAM; 
0

不,它不是最佳的,因为它强制读取所有行。但是,如果桌子很小(我不知道1mn的含义是什么),那么它在某种程度上可能是可以接受的。

此外,您可以限制搜索功能。例如,有些网站限制使用搜索功能,而不会使用其他请求x分钟,而其他网站则强制您输入验证码。

1

您需要为查询列添加索引。如果在搜索表达式的开始处有一个通配符,则MySQL不能使用该索引。

如果除“等于”(LIKE 'test')或“开始于”(LIKE 'test%')以外的任何其他搜索,MySQL将不得不扫描每一行。例如,“包含”搜索(LIKE '%test%')无法使用索引。

您可以允许“结束”('LIKE %test),但是您必须构建一个反向列来索引,以便您可以实际使用LIKE 'test%'以使用该索引。

任何完整的扫描速度都会变慢,行越多,速度越慢。场地越大,它会变得越慢。

您可以看到使用LIKE的限制。因此,您可以创建一个名为标签的表格,在该表格中将单个关键词链接到每个条目而不是使用整个文本,但即使使用标签,我仍会坚持“等于”和“以......开头”。

使用LIKE没有索引的帮助应限于罕见的即席查询或非常小的数据集。