2017-04-26 142 views
1

這是我過去的考題一部分 -索引查詢優化= SQL

優化以下,假設情況是Members.lname指數:

SELECT fname, lname 
FROM Members 
WHERE lname <> 'Rogers' 
    AND memberType='Student'; 

因此,我曾嘗試:

SELECT fname, lname 
FROM Members 
WHERE lname > 'Rogers' OR lname < 'Rogers'AND memberType='Student'; 

我試過這個分裂<>強制使用索引 - 我的答案是錯誤的。我想知道是否有人能夠幫助並指引我朝着正確的方向發展?

+0

lname <>'Rogers'? – Jens

+2

如果您使用'或'和'和',您必須添加圓括號'或'像'(lname>'羅傑斯'或lname <'羅傑斯')AND memberType ='Student'' – Jens

+0

您的表有多少數據?數據插入後您是否完成分析表? – jarlh

回答

2

在我看來,原始查詢本身不能被優化。

lname上有一個索引應該對查詢沒有影響。所有成員都將有一個名字,並且會有很少的成員是羅傑斯。所以DBMS不應該使用索引,而只是讀完整個表。

「優化以下」,但是,可能允許通過創建另一個索引來間接優化查詢。該指數應至少包含與memberType開始:

create index idx1 on members (membertype); 

這是否索引將用於該查詢可能會取決於什麼是在表中。如果99%的成員是學生,DBMS應該讀取完整的表格。如果只有很少的學生(比如3%)使用索引是有意義的,那麼DBMS將使用該索引來查找表中的學生,然後在記錄中檢查lname

話雖如此,我們可能想要這個:

create index idx2 on members (membertype, lname); 

所以DBMS讀取索引,找到學生,如果名稱是羅傑斯,只有訪問表所需的記錄立即看到。

一個更好的指標仍然會包含相關的所有列覆蓋索引,所以表不必再被讀取,因爲所有信息都在索引:

create index idx3 on members (membertype, lname, fname); 

如前所述,數據庫管理系統可能仍會在假設大多數記錄匹配時讀取整個表。索引只是它可能使用或不使用的DBMS的報價。