【问题标题】:MySql DB query optimiser and like keywordMySql DB 查询优化器和like 关键字
【发布时间】:2012-04-28 20:24:08
【问题描述】:

MySql 查询优化器如何处理以下查询?

Select * from Eomlpyees e where e.department_id = 100 and e.name like '%%';

Select * from Eomlpyees e where e.department_id = 100;

第一个查询是一个休眠命名查询。我正在介绍另一个不需要使用“名称”过滤器的 API。

我应该使用第一个查询,通过传递空的“名称”过滤器还是添加第二个命名查询。

【问题讨论】:

  • 这 2 个查询并不严格等价。 e.name like '%%' 不会匹配具有 e.nameNULL 的行。
  • 有意思,如果没有空值的Employees怎么办?
  • 无论如何我都会使用第二个版本——即使e.nameNOT NULL 约束。为什么要依赖优化器?它很聪明,但这个特殊的技巧可能不在聪明的工具集中。作为@aF。建议,您可以随时使用 EXPLAIN 检查您的版本的行为。
  • 嗯,我能理解。但很多时候,我们最终大多是在源代码中复制大量查询。这是我最关心的问题,你愿意分享你的建议吗?
  • 第二个查询是正确的。

标签: mysql sql hibernate query-optimization


【解决方案1】:

首先,这两个查询是不等价的。第二个查询将显示名称的 null 值,但第一个查询不会显示名称的 null 值。

否则第一个查询有两个字段要比较,所以它会比第二个查询花费更多的时间。

【讨论】:

    【解决方案2】:

    在这两种情况下,将使用 department_id 上的索引。在第一个查询中,MySQL 将对结果集执行额外的扫描(在按部门 ID 过滤之后)以过滤记录是否与名称模式匹配。优化器可能会看到这匹配所有帖子并且不执行此扫描(按照建议检查说明),但这也可能是特定于版本的

    【讨论】:

      【解决方案3】:

      您可以使用EXPLAIN 进行检查。

      查看更多信息HERE

      【讨论】:

      • 在我的真实查询中,使用 EXPLAIN 没有区别 :(
      猜你喜欢
      • 2021-05-03
      • 2017-08-13
      • 2012-05-08
      • 2012-08-31
      • 2013-02-02
      • 1970-01-01
      • 2021-05-12
      相关资源
      最近更新 更多