基于文本列进行过滤

时间:2012-11-27 19:26:14

标签: mysql sql performance innodb

基于文本列做一个精确匹配过滤器在概念上比根据一个键获取一组行并使用编程语言过滤要慢吗?

例如:

select columns from table where textcolumn='exactphrase';

VS

select columns from table where key='key';

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

一般来说,在SQL中执行所有操作总是更快,但这确实取决于上述所有内容,因此无法确定。

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

答案 1 :(得分:1)

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

由于正在使用(索引)PK,因此最多将返回单个记录。服务器足够聪明,在文本列上执行表扫描,即使由于PK的1-1基数而没有编入索引。 (查询规划人员很聪明。)

差异在于:

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

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


  3. 1 虽然可以想象非常简并的情况,但这应该被视为“等效时间”而没有明确的使用/性能案例。然而,IMOHO仍然在客户方面做这件事而没有进一步的理由。