【问题标题】: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 分钟,而另一些网站则强制您输入验证码。

        【讨论】:

          猜你喜欢
          • 2012-09-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-27
          • 2013-01-11
          • 2013-02-09
          • 1970-01-01
          相关资源
          最近更新 更多