⼀ 、初識索引
為什麼要有索引?
⼀般的應⽤系統,讀寫比例在10:1左右,⽽且插入操作和⼀般的更新操作很少出現效能問題,在⽣產環境中, 我們遇到最多的,也是最容易出問題的,還是⼀些複雜的查詢操作,因此對查詢語句的優化顯然是重中之重。 說起加速查詢,就不得不提到索引了。
什麼是索引?
索引在mysql中也叫是⼀種「鍵」,是儲存引擎⽤於快速找到記錄的⼀種資料結構。索引對於良好的效能 非常關 鍵,尤其是當表中的資料量越來越⼤時,索引對於效能的影響愈發重要。 索引優化應該是對查詢效能優化最有
效的⼿段了。索引能夠輕易將查詢效能提⾼好⼏個數量級。 索引相當於字典的⾳序表,如果要查某個字,如果 不使⽤⾳序表,則需要從⼏百⻚中逐⻚去查。
⼆、索引的原理
索引的⽬的在於提⾼查詢效率,與我們查閱圖書所⽤的⽬錄是⼀個道理:先定位到章,然後定位到該章下的⼀個⼩節,然後找到⻚數。相似的例⼦還有:查字典,查火⻋⻋次,⻜機航班等本質都是:通過不斷地
縮⼩想要獲取資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是說,有了這種索引機制,我們可以總是⽤同⼀種查詢⽅式來鎖定資料。資料庫也是⼀樣,但顯然要複雜的多,因為
不僅⾯臨著等值查詢,還有範圍查詢(>、
呢?最簡單的如果1000條資料,1到100分成第⼀段,101到200分成第⼆段,201到300分成第三段......這樣查第250條資料,只要找第三段就可以了,⼀下⼦去除了90%的⽆效資料。但如果是1千萬的記錄呢,
分成⼏段比較好?稍有演算法基礎的同學會想到搜尋樹,其平均複雜度是lgn,具有不錯的查詢效能。但這⾥我們忽略了⼀個關鍵的問題,複雜度模型是基於每次相同的操作成本來考慮的。⽽資料庫實現比較複雜,
⼀⽅⾯資料是儲存在磁碟上的,另外⼀⽅⾯為了提⾼效能,每次⼜可以把部分資料讀入記憶體來計算,因為我們知道訪問磁碟的成本⼤概是訪問記憶體的⼗萬倍左右,所以簡單的搜尋樹難以滿⾜複雜的應⽤場景。
三、索引管理
⼀ 功能
#1. 索引的功能就是加速查詢
#2. mysql中的primary key,unique,聯合唯⼀也都是索引,這些索引除了加速查詢以外,還有約束的功能
⼆ mysql常⽤的索引
普通索引
index:加速查詢
唯⼀索引:
-主鍵索引primary key:加速查詢+約束(不為空、不能重複)
-唯⼀索引unique:加速查詢+約束(不能重複)
聯合索引:
-primary key(id,name):聯合主鍵索引
-unique(id,name):聯合唯⼀索引
-index(id,name):聯合普通索引
三 索引的兩⼤型別hash與btree
舉個例⼦來說,比如你在為某商場做⼀個會員卡的系統。
這個系統有⼀個會員表
有下列字段:
會員編號 int
會員姓名 varchar(10)
會員⾝份證號碼 varchar(18)
會員** varchar(10)
會員住址 varchar(50)
會員備註資訊 text
那麼這個 會員編號,作為主鍵,使⽤ primary
會員姓名 如果要建索引的話,那麼就是普通的 index
會員⾝份證號碼 如果要建索引的話,那麼可以選擇 unique (唯⼀的,不允許重複)
#除此之外還有全文索引,即fulltext
會員備註資訊 , 如果需要建索引的話,可以選擇全文搜尋。
⽤於搜尋很⻓⼀篇文章的時候,效果最好。
⽤在比較短的文字,如果就⼀兩⾏字的,普通的 index 也可以。
但其實對於全文搜尋,我們並不會使⽤mysql⾃帶的該索引,⽽是會選擇第三⽅軟體如sphinx,專⻔來做全文搜尋。
#其他的如空間索引spatial,了解即可,⼏乎不⽤
四 建立/刪除索引的語法
#⽅法⼀:建立表時
create table 表名 (
欄位名1 資料型別 [完整性約束條件…],
欄位名2 資料型別 [完整性約束條件…],
[unique | fulltext | spatial ] index | key
[索引名] (欄位名[(⻓度)] [asc |desc])
#⽅法⼆:create在已存在的表上建立索引
create [unique | fulltext | spatial ] index 索引名
on 表名 (欄位名[(⻓度)] [asc |desc]) ;
#⽅法三:alter table在已存在的表上建立索引
alter table 表名 add [unique | fulltext | spatial ] index
索引名 (欄位名[(⻓度)] [asc |desc]) ;
#刪除索引:drop index 索引名 on 表名字;
mysql預設索引 mysql的索引
什麼是索引 當你在字典中查詢你的名字的時候,你有兩種方式。第 一 一頁一頁的翻,第 二 通過拼音 筆畫,等查詢。那麼第二種方式就是通過索引的方式查詢。那麼在myslq中資料庫也是這麼幹的。索引可以增加查詢速度,但是同時mysql維護索引也需要耗費效能。索引的分類 主鍵索引 如果乙個字段為主鍵 pri...
mysql索引要素 mysql索引和索引的原理
首先為什麼要加索引?資料庫伺服器有兩種儲存介質,我們需要把索引放到硬碟上,在硬碟上進行查詢時會產生i o 操作 我們通過索引來查詢某 資料的時候,需要計算產 的磁碟 i o 次數,當磁碟 i o 次數越多,所消耗的時間也就越 如果我們能讓索引的資料結構儘量減少硬碟的 i o操作,所消耗的時間也就越 ...
mysql 索引 手冊 MySQL 索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...