您所说的完全正确,临时表仅对当前用户/连接可见。尽管如此,仍然存在一些开销和其他一些问题,例如:
- 对于您将要创建并填充该表(并稍后删除)的数千个搜索中的每一个 - 不是每个用户,每个搜索。因为每次搜索很可能会重新执行脚本,并且“每个会话”并不意味着 PHP 会话——它意味着数据库会话(打开连接)。
- 您将需要您可能没有的
CREATE TEMPORARY TABLES
特权。
- 尽管如此,该表确实应该具有 MEMORY 类型,它比看起来更能窃取您的 RAM。因为即使有 VARCHAR,MEMORY 表也使用固定长度的行存储。
- 如果您的启发式方法稍后需要引用该表两次(如
SELECT xyz FROM patternmatch AS pm1, patternmatch AS pm2 ...
) - 这对于 MEMORY 表是不可能的。
接下来,对您和数据库而言,将其LIKE '%xyz%'
直接添加到您的images
表WHERE
子句会更容易。它将做同样的事情,而无需创建 TEMP TABLE 并加入它。
在任何情况下 - 无论你走哪条路 - WHERE 都会非常缓慢。即使您添加了一个索引,images.name
您也很可能需要LIKE '%xyz%'
代替 LIKE 'xyz%'
,因此该索引不会被使用。
我在问一个特定于会话的临时表来处理用户的搜索输入(在搜索时创建,在会话结束时删除)是否是处理搜索功能的适当方式。
不。 :)
替代选择
MySQL 有一个内置的全文搜索(从 5.6 开始也适用于 InnoDB),它甚至可以为您提供评分:我强烈建议您阅读并尝试一下。您可以确定数据库比您更了解如何有效地进行搜索。
如果您打算使用 MyISAM 而不是 InnoDB,请注意经常被忽视的限制,即 FULLTEXT 搜索仅在结果数少于表总行数的 50% 时才返回任何内容。
您可能想要查看的其他内容例如 Solr(对该主题本身的很好的介绍将是http://en.wikipedia.org/wiki/Apache_Solr的开头)。我们在公司中使用它,它做得很好,但它需要相当多的学习。
概括
当前问题本身(搜索)的解决方案是使用 FULLTEXT 功能。
如果我每秒有数十万次搜索,我可能会遇到什么样的性能问题?有没有更好的方法来实现搜索功能?
给你一个数字,每秒 10.000 次调用已经不是“微不足道的”——每秒数十万次搜索,你会遇到的那种性能问题在你的设置中无处不在。您将需要几台服务器、负载平衡和大量其他令人惊叹的技术垃圾。其中之一将是例如 Solr ;)