【问题标题】:Implementing database search through query using like使用like通过查询实现数据库搜索
【发布时间】:2011-03-09 04:47:44
【问题描述】:
我打算通过一个网站来实现数据库搜索——我知道mysql提供了全文搜索,但结果发现它不支持innodb引擎(我需要它来支持事务)。
其他选项是使用 sphinx 或类似的索引应用程序。但是,它们需要对数据库结构进行一些重构,并且可能需要比我更多的时间来实现。
所以我决定采用每个表并将其所有相关列连接到一个新添加的 QUERY 列中。该查询列还应从其他相关表的列中招募。
完成后,我将在要搜索的表的查询列上使用'like'子句来搜索返回特定域(相关表组)的结果。
由于我的数据库预计不会太大(最大表中
有人同意这种方法或有更好的主意吗?
【问题讨论】:
标签:
mysql
database
search
full-text-search
【解决方案1】:
您不会对使用带有通配符的 LIKE 的解决方案感到满意。它的执行速度比使用全文搜索技术慢数百或数千倍。
请参阅我的演示文稿Practical Full-Text Search in MySQL。
我建议不要将值复制到 QUERY 列中,而是将值复制到定义了 FULLTEXT 索引的 MyISAM 表中。您可以使用触发器来执行此操作。
您不需要将值连接在一起,您只需要主键列和每个可搜索的文本列。
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;
【解决方案2】:
您需要为查询列添加索引。如果搜索表达式开头有通配符,则 MySQL 无法使用索引。
如果您进行除“等于”(LIKE 'test') 或“开始于”(LIKE 'test%') 之外的任何搜索,MySQL 将不得不扫描每一行。例如,“包含”搜索 (LIKE '%test%') 无法使用索引。
您可以允许“以”结尾 ('LIKE %test),但您必须构建一个反向列来建立索引,以便您实际上可以执行 LIKE 'test%' 以使用索引。
任何全盘扫描都会很慢,而且行数越多,它就会越慢。字段越大,速度越慢。
您可以看到使用LIKE 的限制。因此,您可以创建一个名为 Tags 的表,在其中将单个关键词链接到每个条目,而不是使用整个文本,但我仍然会坚持使用“等于”和“开始于”,即使有标签。
在不借助索引的情况下使用 LIKE 应仅限于罕见的临时查询或非常小的数据集。
【解决方案3】:
不,它不是最优的,因为它强制读取所有行。但是,如果你的桌子很小(我不知道
此外,您可以限制搜索功能。例如,某些网站限制使用搜索功能的请求不超过 x 分钟,而另一些网站则强制您输入验证码。