0

我试图让在一组相互链接的 MySQL 表上执行关键字搜索变得快速和容易。

有一个具有唯一“itemID”的项目表,相关数据分布在其他表中,所有表都通过 itemID 链接。

我创建了一个视图,它将大部分信息连接成一个可用的形式。这使搜索变得非常容易,但对性能没有帮助。这是我第一次使用视图,也许不是正确的用途。如果有人能给我一些指点,我将不胜感激。

一个简化的例子是:

物品表:

itemID |  name 
------   -------
   1      "James"
   2      "Bob"
   3      "Mary"

关键词表:

keywordID |  itemID |  keyword
------      -------   -------
   1           2        "rabbit"
   2           2        "dog"
   3           3        "chicken" 

加上更多的关系......

我的观点:(使用 CONCAT_WS、GROUP_CONCAT 和一些 JOIN 创建)

itemID |  important_search_terms 
------   -------
   1      "James ..."
   2      "Bob, rabbit, dog ..."
   3      "Mary, chicken ..."

然后我可以在视图中搜索“mary”和“chicken”并轻松找到 itemID=3 匹配项。杰出的!

问题是,它似乎在为每次搜索都做 CONCAT 和 JOIN 的所有工作,但效率不高。我目前的测试数据搜索大约需要 2 秒,这是不切实际的。

我希望视图会以某种方式被缓存,但也许我没有以正确的方式使用它。

我可以有一个包含我定期更新的搜索信息的实际表格,但它看起来并不像我希望的那样整洁。

如果有人有任何建议,我将不胜感激。非常感谢

4

3 回答 3

1

好吧,视图只不过是让您更容易阅读您查询的内容,但在下面每次都执行位于下面的 SQL 语句。

因此,难怪它和您运行该语句本身一样慢(甚至更慢......)。

通常这是通过索引作业(在夜间运行,不会打扰任何人)或索引插入(当插入新数据时,检查是否将它们插入索引的有趣单词是一个好主意)来完成。

在运行时拥有它真的很难,并且需要精心设计的数据库结构和大部分时间强大的 sql server 硬件(取决于数据量)。

于 2012-08-29T18:05:00.770 回答
1

MySQL 视图与其他 SQL 语言中的物化视图不同。它真正做的只是缓存查询本身,而不是查询所需的数据。

MySQL 视图的主要用途是消除您必须一遍又一遍地编写的重复查询。

于 2012-08-29T18:05:19.960 回答
1

你让它变得简单,但没有让它变得很快。我认为,如果您查看查询的 EXPLAIN,您将看到 MySQL 在每次运行查询时都在实现该视图(将视图查询中的结果集的副本写为“派生表”),并且然后从该“派生表”运行查询。

如果您可以分别针对每个表运行“搜索”谓词,您将获得更好的性能,如下所示:

SELECT 'items' AS source, itemID, name AS found_term 
  FROM items WHERE name LIKE 'foo'
 UNION ALL
SELECT 'keywords', itemID, keyword 
  FROM keywords WHERE keyword LIKE 'foo'
 UNION ALL
SELECT 'others', itemID 
  FROM others WHERE other LIKE 'foo'

-或者-

如果您不关心匹配的术语是什么,或者它是在哪个表中找到的,并且您只想返回匹配的 itemID 的不同列表

SELECT itemID
  FROM items WHERE name LIKE 'foo'
 UNION
SELECT itemID
  FROM keywords WHERE keyword LIKE 'foo'
 UNION
SELECT itemID 
  FROM others WHERE other LIKE 'foo'
于 2012-08-29T18:10:25.100 回答