0

基于文本列的完全匹配过滤器在概念上是否比基于键抓取一组行并使用编程语言进行过滤要慢?

例如:

select columns from table where textcolumn='exactphrase';

对比

select columns from table where key='key';

for (results : resultset) { 
      if (resulsts.getString(textcolumn).equals(exactphrase)) { ... } }

我基本上很好奇 MySQL(Innodb)如何处理过滤文本列以及性能缺陷可能是什么(如果有的话)。

4

2 回答 2

3

也许吧,但我对此表示怀疑。

在一组约束中,每个表、数据库和查询都是不同的。在单个服务器上,查询的“快速”程度取决于以下因素(以及许多其他因素):

  • 索引
  • 列的基数 - 有多少不同的值与值的数量。
  • 列的宽度
  • 表中的记录数
  • 查询中返回的字节数。
  • 是否有其他人在使用数据库/服务器

一般来说,在 SQL 中做所有事情总是更快,但这确实取决于上述所有内容,所以它绝不是肯定的。

唯一确定的方法是自己尝试。如果您遇到问题,您可以随时发布您的查询、解释计划以及表和索引定义,也许有人可以提供帮助。

于 2012-11-27T19:36:01.957 回答
1

tldr; “查找”记录不会有性能差异。

由于正在使用(索引)PK ,因此最多将返回一条记录。服务器足够智能,不会对文本列执行表扫描,即使由于 PK 的 1-1 基数而没有对其进行索引。(查询计划者很聪明。)

那么区别是:

  1. 服务器可能会向客户端返回“无用”记录;这可能会浪费少量的带宽1(如果除了测试之外不需要文本,则稍微浪费一点),但更重要的是它会混淆查询的语义

  2. 服务器支持不同的排序方式;因此,它可能在服务器上不区分大小写(例如),并导致与客户端过滤器略有不同的结果。


1虽然可以想象非常退化的情况,但这应该被视为没有明确使用/性能情况的“等效时间”。但是,IMOHO 仍然草率地在客户端执行此操作而没有进一步的理由。

于 2012-11-27T19:34:31.970 回答