Mysql 基于文本列的筛选

Mysql 基于文本列的筛选,mysql,sql,performance,innodb,Mysql,Sql,Performance,Innodb,从概念上讲,基于文本列进行精确匹配筛选比基于键获取一组行并使用编程语言进行筛选慢吗 例如: select columns from table where textcolumn='exactphrase'; vs 我基本上很好奇MySQL(Innodb)是如何处理过滤文本列的,以及可能存在的性能缺陷(如果有的话)。tldr在“查找”记录时不会有性能差异。 由于正在使用(索引)PK,因此最多将返回一条记录。服务器足够聪明,不会对文本列执行表扫描,即使它因为PK的1-1基数而没有索引。(查询计划器

从概念上讲,基于文本列进行精确匹配筛选比基于键获取一组行并使用编程语言进行筛选慢吗

例如:

select columns from table where textcolumn='exactphrase';
vs


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

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

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

区别在于:

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

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



  • 1虽然可以想象非常退化的情况,但在没有明确的使用/性能情况下,应将其视为“等效时间”。然而,IMOHO在客户端这样做却没有更多的理由,这仍然是草率的在“查找”记录时不会有性能差异。

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

    区别在于:

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

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


  • 1虽然可以想象非常退化的情况,但在没有明确的使用/性能情况下,应将其视为“等效时间”。然而,IMOHO在客户端这样做却没有更多的理由,这仍然是草率的。

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

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

    • 索引
    • 列的基数-有多少个不同的值与值的数量
    • 列的宽度
    • 表中的记录数
    • 查询中返回的字节数
    • 是否有其他人正在使用数据库/服务器
    一般来说,用SQL做任何事情都会更快,但这取决于以上所有方面,所以这一点并不确定

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

    可能,但我对此表示怀疑

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

    • 索引
    • 列的基数-有多少个不同的值与值的数量
    • 列的宽度
    • 表中的记录数
    • 查询中返回的字节数
    • 是否有其他人正在使用数据库/服务器
    一般来说,用SQL做任何事情都会更快,但这取决于以上所有方面,所以这一点并不确定


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

    对不起,我更新了我的帖子。我很感激你的解释,但我无意中一直在写主键,其实我只是指一个索引列。@tau再说一次,现代查询规划师很聪明。他们几乎总是喜欢索引而不是表扫描,这取决于统计数据。如果有疑问,请询问使用的具体查询计划。对不起,我更新了我的帖子。我很感激你的解释,但我无意中一直在写主键,其实我只是指一个索引列。@tau再说一次,现代查询规划师很聪明。他们几乎总是喜欢索引而不是表扫描,这取决于统计数据。如果有疑问,询问使用的具体查询计划。
    select columns from table where key='key';
    
    for (results : resultset) { 
          if (resulsts.getString(textcolumn).equals(exactphrase)) { ... } }