索引是幫助mysql高效獲取資料的排好序的資料結構mysql底層資料結構
b-tree 特點
儲存引擎
-99% innodb, 早期myisam
mylasm儲存引擎磁碟檔案
用途tb_myisam.myi
index, 儲存的索引, b+樹
tb_myisam.myd
data, 儲存的資料
tb_myisam.frm
表結構資訊
innodb儲存引擎磁碟檔案
用途order_.frm
表結構資訊
order_.ibd
data, 儲存的資料
innodb儲存引擎實現(聚集)
hash索引
聯合索引
覆蓋索引
explain工具介紹
索引設計原則
**先行,索引後上
不知大家一般是怎麼給資料表建立索引的,是建完表馬上建立索引嗎?
這其實是不對的,一般應該等到主體業務功能開發完畢,把涉及到該錶相關的sql拿出來分析後,再建立索引。
聯合索引盡量覆蓋條件
比如設計乙個或者兩三個聯合索引(盡量少建單值索引),讓每乙個聯合索引都盡量去包含sql語句裡的where,order by , group by的字段,還要確保這些聯合索引的字段順序盡量滿足sql查詢的最左字首原則。
不要在小基數字段上建立索引
索引基數是指這個欄位在表裡總共有多少個不同的值,比如一張表總共100萬行記錄,其中有個性別字段,其值不是男就是女,那麼該字段的基數就是2
如果對這種小基數字段建立索引的話,還不如全表掃瞄,因為你的索引樹里就包含男和女兩種值,根本沒法進行快速的二分查詢,那用索引就沒有太大的意義了。
一般建立索引,盡量使用那些基數比較大的字段,就是值比較多的字段,那麼才會發揮出b+樹快速二分查詢的優勢來。
長字串我們可以採用字首索引
盡量對欄位型別較小的列設計索引,比如說 tinyint之類的,因為字段型別較小的話,占用磁碟空間也會比較i笑傲,此時你在搜尋的時候效能也會比較好一點。
where 與 order by 衝突時,優先where
基於慢sql查詢做優化
可以根據監控後台的一些慢sql,針對這些慢sql查詢做特定的索引優化
對於關聯sql的優化
關聯欄位加索引,讓mysql做join操作時,盡量選擇nlj演算法
小表驅動大表,寫多表連線sql時,如果明確知道哪張表示小表,可以使用straight_join寫法固定倆捏驅動方式,省去mysql優化器自己判斷的時間。
straight_join 只適用於inner join,並不適用於left join,right join 。(因為left join, right join 已經代表了表的執行順序)
盡可能讓優化器去判斷,因為大部分情況下mysql優化器比人智慧型,使用straight_join一定要慎重,因為部分情況下人為指定的執行順序並不一定會比優化引擎要靠譜。
對於小表定義的明確
在決定哪個表做驅動表的時候,應該是兩個表按照各自的條件過濾,過濾完成之後,計算參與join的各個欄位的總資料量,資料量小的那個表,就是「小表」,應該作為驅動表。
MySQL索引之B 樹索引
b 樹索引是是目前關係型資料庫系統中查詢最為常用和最為有效的索引,b 樹的索引構造類似於二叉樹,根據鍵值 key value 快速找到資料。1 什麼是b 樹?首先,b 樹中的b並不是二叉樹 binary 的意思,這裡的b表示的是blance即平衡的意思。那麼b 樹其實就是平衡查詢樹。其滿足兩個條件 ...
MySQL 索引中的b樹索引
1.索引如果沒有特別指明型別,一般是說b樹索引,b樹索引使用b樹資料結構儲存資料,實際上很多儲存引擎使用的是b 樹,每乙個葉子節點都包含指向下乙個葉子節點的指標,從而方便葉子節點的範圍遍歷 2.底層的儲存引擎也可能使用不同的儲存結構,比如ndb集群儲存引擎使用了t樹,innodb使用的是b 樹 3....
Mysql 索引(B樹或B 樹)
參考1 參考2myisam索引與innodb索引相比較 myisam支援全文索引 fulltext 壓縮索引,innodb不支援 innodb支援事務,myisam不支援 myisam順序儲存資料,索引葉子節點儲存對應資料行位址,輔助索引很主鍵索引相差無幾 innodb主鍵節點同時儲存資料行,其他輔...