索引建立需要綜合考慮到讀寫操作比例來定。
sql sever索引型別有:唯一索引,主鍵索引,聚集索引,非聚集索引。
若是高頻率的查詢需求(例如首頁),通常會因為更新的頻率過高,而導致存在一定的阻塞,或者產生死鎖。
讀寫分離(通過資料庫的發布訂閱拷貝多乙份資料來實現,雖然說資料拷貝多了乙份,而且讀庫的索引也同樣需要建立
但是資料插入時不會有太多的等待與死鎖的出現,因為寫庫時不需要建立太多的索引,而且減少了資源的爭奪)
聚集索引
聚集索引也叫聚簇索引。是按順序儲存的
定義:資料行的物理順序與列值(一般是主鍵的那一列)的邏輯順序相同,乙個表中只能擁有乙個聚集索引。
當聚集表中,新增資料比較頻繁時,建議使用數值型別(int,bigint, 等型別)
《sql server效能調優實戰》p198
guid主鍵情況
嚴重杜絕把聚集索引建在guid列
聚集索引新增到每張表中都會有【資料產生時間】列
出於歸檔考慮我的每張表中都會有【資料產生時間】列,將原屬於主鍵的聚集索引新增到該類上,保障了聚集索引的正常工作。
非聚集索引
非聚集(unclustered)索引。
定義:該索引中索引的邏輯順序與磁碟上行的物理儲存順序不同,乙個表中可以擁有多個非聚集索引。
復合索引(覆蓋索引)
建立兩列以上的索引,即可查詢復合索引裡的列的資料而不需要進行回表二次查詢,如index(col1, col2),執行下面的語句
在sql server中還有include的用法,可以把非聚集索引裡包含的列包含進來,而不一定需要建立復合索引。
-- 檢視表是否存在索引
exec sp_helpindex 'testquestion'
--建立聚集索引
// drop_existing = :表示如果這個索引還在表上就 drop 掉然後在 create 乙個新的。 預設為 off。
create clustered index pk_examstudent on examstudentresit(examstudentid) with (drop_existing=on)
create clustered index pk_examstudent on examstudentresit(examstudentid)
// unique 代表唯一
create unique clustered index idx_createdon on examquesask(createdon,sortid) with (drop_existing=on)
--建立非聚集索引
create index idx_student_id on examquesask(examstudentid)
--建立非聚集索引,2個字段
《sql server效能調優實戰》
聚集索引與非聚集索引的總結
【sqlserver】sqlserver索引的建立、檢視、刪除
通過非聚集索引讓select count(*) from 的查詢速度提高幾十倍、甚至千倍
sqlserver索引小結
mysql索引的選擇 MySQL索引的選擇
hash索引和b 樹索引 那為什麼不使用其他的資料結構作為索引?hash索引 雜湊表的特點就是可以快速的精確查詢,但是不支援範圍查詢。如果做成了索引,那速度也是很慢的,要全部掃瞄。平衡二叉樹 1 索引也不只是在記憶體裡面儲存的,還是要落盤持久化的,如果資料多了,樹高會很高,查詢的成本就會隨著樹高的增...
mysql索引的選擇 Mysql索引選擇邏輯
索引選擇邏輯 優化器選擇索引的目的,是找到乙個最優的執行方案,並用最小的代價去執行語句。在資料庫裡面,掃瞄行數是影響執行代價的因素之一。掃瞄的行數越少,意味著訪問磁碟資料的次數越少,消耗的 cpu 資源越少 掃瞄行數是怎麼判斷的?mysql 在真正開始執行語句之前,並不能精確地知道滿足這個條件的記錄...
mysql 選擇索引 mysql選擇索引
1 盡量為用來搜尋 分類或分組的資料列編制索引,不要為作為輸出顯示的資料列編制索引。最適合有索引的資料列是那些在where子句中資料列,在聯結子句 現的資料列,或者是在group by order by子句 現的資料列。select 後的資料列最好不要用索引。2 綜合考慮各資料列的維度。資料列的維度...