2012-04-17 65 views
2

MySql查询优化器如何处理以下查询?MySql数据库查询优化器和类似关键字

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

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

第一个查询是一个hibernate命名查询。我正在引入另一个不需要使用'name'过滤器的API。

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

+2

2个查询不是严格等价的。像'%%'这样的e.name不会匹配具有'NULL'的'e.name'的行。 – 2012-04-17 13:32:12

+0

有趣的是,如果没有雇员与空值? – 2012-04-17 13:35:34

+0

无论如何,我会使用第二个版本 - 即使“e.name”有NOT NULL约束。为什么依靠优化器?这很聪明,但这个特殊的技巧可能不在智能工具集中。作为@aF。建议,你总是可以用'EXPLAIN'来检查你的版本的行为。 – 2012-04-17 13:38:51

回答

1

您可以使用EXPLAIN作为checjk。

查看更多信息HERE

+1

在我真正的查询中,使用EXPLAIN :() – 2012-04-17 13:38:56

2

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

1

首先,两个查询都不相同。第二个查询将显示名称的null值,但第一个查询不会显示null名称的值。

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