一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現效能問題,在生產環境中,我們遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作,因此對查詢語句的優化顯然是重中之重。說起加速查詢,就不得不提到索引了。
索引在mysql中也叫是一種「鍵」,是儲存引擎用於快速找到記錄的一種資料結構。索引對於良好的效能非常關鍵,尤其是當表中的資料量越來越大時,索引對於效能的影響愈發重要。
索引優化應該是對查詢效能優化最有效的手段了。索引能夠輕易將查詢效能提高好幾個數量級。
索引相當於字典的音序表,如果要查某個字,如果不使用音序表,則需要從幾百頁中逐頁去查。
索引是應用程式設計和開發的乙個重要方面。若索引太多,應用程式的效能可能會受到影響。而索引太少,對查詢效能又會產生影響,要找到乙個平衡點,這對應用程式的效能至關重要。一些開發人員總是在事後才想起新增索引----我一直認為,這源於一種錯誤的開發模式。如果知道資料的使用,從一開始就應該在需要處新增索引。開發人員往往對資料庫的使用停留在應用的層面,比如編寫sql語句、儲存過程之類,他們甚至可能不知道索引的存在,或認為事後讓相關dba加上即可。dba往往不夠了解業務的資料流,而新增索引需要通過監控大量的sql語句進而從中找到問題,這個步驟所需的時間肯定是遠大於初始新增索引所需的時間,並且可能會遺漏一部分的索引。當然索引也並不是越多越好,我曾經遇到過這樣乙個問題:某台mysql伺服器iostat顯示磁碟使用率一直處於100%,經過分析後發現是由於開發人員新增了太多的索引,在刪除一些不必要的索引之後,磁碟使用率馬上下降為20%。可見索引的新增也是非常有技術含量的。
索引的目的在於提高查詢效率,與我們查閱圖書所用的目錄是乙個道理:先定位到章,然後定位到該章下的乙個小節,然後找到頁數。相似的例子還有:查字典,查火車車次,飛機航班等
本質都是:通過不斷地縮小想要獲取資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是說,有了這種索引機制,我們可以總是用同一種查詢方式來鎖定資料。
資料庫也是一樣,但顯然要複雜的多,因為不僅面臨著等值查詢,還有範圍查詢(>、
考慮到磁碟io是非常高昂的操作,計算機作業系統做了一些優化,當一次io時,不光把當前磁碟位址的資料,而是把相鄰的資料也都讀取到記憶體緩衝區內,因為區域性預讀性原理告訴我們,當計算機訪問乙個位址的資料的時候,與其相鄰的資料也會很快被訪問到。每一次io讀取的資料我們稱之為一頁(page)。具體一頁有多大資料跟作業系統有關,一般為4k或8k,也就是我們讀取一頁內的資料時候,實際上才發生了一次io,這個理論對於索引的資料結構設計非常有幫助。
mysql索引的資料結構-b+樹介紹:
索引的功能就是加速查詢
mysql中的primary key,unique,聯合唯一也都是索引,這些索引除了加速查詢以外,還有約束的功能
聯合索引:
copy
mongo 唯一約束索引 mysql 索引
在關聯式資料庫中,如果有上萬甚至上億條記錄,在查詢記錄的時候,想要獲得非常快的速度,就需要使用索引。索引是關聯式資料庫中對某一列或多個列的值進行預排序的資料結構。通過使用索引,可以讓資料庫系統不必掃瞄整個表,而是直接定位到符合條件的記錄,這樣就大大加快了查詢速度。使用add index idx sc...
唯一約束,主鍵約束,唯一索引
1.unique約束和primary key約束用來保證同一表中指定的列上沒有重複值,這兩個約束都產生唯一索引確保資料一致性,預設情況下,unique約束產生唯一的非聚集索引,primary key約束產生唯一的聚集索引。primary key約束比unique約束嚴格 primary key列不允...
oracle 唯一約束 和 唯一索引
唯一性約束 唯一性約束指表中乙個字段或者多個字段聯合起來能夠唯一標識一條記錄的約束。聯合欄位中,可以包含空值。注 在oracle中,唯一性約束最多可以有32列。唯一性約束可以在建立表時或使用alter table語句建立。唯一性約束和主鍵的區別 主鍵 primary key 所有組成主鍵的列都不能包...