Sql-Server
聚集索引的順序是否與搜尋時的非聚集索引具有相同的約束?
我有一個充滿一堆數據的表,我想使用以下聚集索引:
[account_id, group_id, run_id, page_id, date]
對於非聚集索引,如果我要使用涉及
account_id
、page_id
和的 WHERE 過濾器date_time
,我知道該索引將不起作用,因為我不包括group_id
andrun_id
。使用聚集索引時是否同樣適用?我經常想以如下形式進行查詢:SELECT * FROM my_table WHERE ad_account_id = %d AND page_id = %d AND date >= DATE(%s) AND date <= DATE(%s)
但有時我會遇到以下問題:
SELECT * FROM my_table WHERE ad_account_id = %d AND group_id = %d AND date >= DATE(%s) AND date <= DATE(%s)
或者
SELECT * FROM my_table WHERE ad_account_id = %d AND group_id = %d AND run_id = %d AND date >= DATE(%s) AND date <= DATE(%s)
尚不清楚這些是否利用了超過給出的聚集索引
account_id
(我很確定這不是在進行全表掃描,但即使在那裡也不確定)。
只是從左到右思考,直到你遇到一個差距。
對於第一季度,SQL Server 可以搜尋 ad_account_id(假設它在索引中並且您在索引定義中有錯字),然後掃描具有該值的那些。
對於 Q2,SQL server 可以搜尋 ad_account_id 和 group_id 然後掃描它們。
對於 Q3,SQL Server 可以查找 WHERE 子句中的所有列。
所以,是的,相同的原則適用於聚集索引和非聚集索引。