【问题标题】:Filtering based on a text column基于文本列的过滤
【发布时间】:2012-11-27 19:26:13
【问题描述】:

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

例如:

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) 如何处理过滤文本列以及性能缺陷可能是什么(如果有的话)。

【问题讨论】:

    标签: mysql sql performance innodb


    【解决方案1】:

    也许,但我怀疑。

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      那么区别是:

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

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


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

      【讨论】:

      • 对不起,我更新了我的帖子。我很欣赏这个解释,但是当我真的只是一个索引列时,我不小心一直写主键。
      • @tau 同样,现代查询规划器很聪明。根据统计数据,它们几乎总是倾向于索引而不是表扫描。如有疑问,请询问所使用的具体查询计划。
      猜你喜欢
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多