2012-04-17 72 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名稱的值。

否則第一個查詢有兩個字段進行比較,所以它會花費更多的時間,然後第二個查詢。