【发布时间】: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.name和NULL的行。 -
有意思,如果没有空值的Employees怎么办?
-
无论如何我都会使用第二个版本——即使
e.name有NOT NULL约束。为什么要依赖优化器?它很聪明,但这个特殊的技巧可能不在聪明的工具集中。作为@aF。建议,您可以随时使用EXPLAIN检查您的版本的行为。 -
嗯,我能理解。但很多时候,我们最终大多是在源代码中复制大量查询。这是我最关心的问题,你愿意分享你的建议吗?
-
第二个查询是正确的。
标签: mysql sql hibernate query-optimization