大家好,我是anyux。本文介紹MySQL資料庫的索引創建與刪除。
BTree樹的索引分類
聚集索引,聚集索引一般是主鍵列輔助索引,輔助索引輔助聚集索引
聚集索引生成過程
MySQL會自動選擇主鍵作為聚集索引列,沒有主鍵列會選擇唯一鍵,如果都沒有會生成隱藏的主鍵列
MySQL進行存儲時,會按照聚集索引列值的順序,有序存儲數據行聚集索引直接將原表數據頁,作為葉子結點,然後提取聚集索引列向上生成枝和根
輔助索引生成過程
管理員選擇一個列創建輔助索引
MySQL會自動將此列的值取出來將此列的值自動排序將排好序的數據,均勻的存儲到索引的葉子節點生成枝節點和根節點
輔助索引的使用過程
先遍歷輔助索引,找到對應的索引鍵值所對應的id值或者是主鍵值,進而使用主鍵值回到聚集索引,再進行遍歷查詢找到指行數據
聚集索引和輔助索引的區別
表中的任何一個列都可以創建輔助索引,在你有需要的時候,只要名字不同即可在一張表中,聚集索引只能有一個,一般是主鍵輔助索引,葉子結點只存儲索引列的有序值聚集索引,葉子結點存儲的是有序的整行數據MySQL的表數據存儲是聚集索引組織表
輔助索引細分
單列輔助索引
聯合索引(覆蓋索引)[重要]
唯一索引
索引樹高度通常情況下,千萬級別的數據,索引樹高度應該在3~4層,
數據行數較多時候
分表:MySQL自帶的partion功能,使用的比較少了
分片:分布式架構(分庫)
欄位長度
業務允許,儘量選擇長度短的列作為索引列
業務不允許,選擇前綴索引
數據類型
對於變長長度的列來講,使用varchar類型比char類型要有優勢。對於大表而言,使用char數據類型的每個索引長度都是固定值,空格也算在索引的長度裡面,而varchar不是。所以葉子結點的消耗較大,因而要選擇varchar數據類型
索引的命令操作
索引查詢
PRI 主鍵索引
MUL 輔助索引
UNI 唯一索引
use world;
查看索引
desc city;
查看索引詳細信息
show index from city;
創建索引
注意,創建索引也是在線的DDL操作,操作時也會出現鎖表現象。所以創建索引操作應該是業務低谷時間進行操作或者使用PTOSC這樣的工具操作,減少對業務的影響
創建單列的輔助索引
use world;
為city表的name列創建索引
alter table city add index idx_name(name);
查看索引詳情
show index from city;
創建聯合多列的輔助索引
use world;alter table city add index idx_c_p(countrycode,population);
創建唯一索引
注意,首先需要判斷創建索引的列是否存在重複值,存在重複值的列,無法創建唯一索引
use world;select count(district) from city;select count(distinct district) from city;
事實說明存在重複值,district列不應當做唯一索引
alter table city add unique index uidx_dis(district);
創建前綴索引
前綴索引和普通索引沒差,只是不能使用數字作為索引列
use world;alter table city add index idx_dis(district(5));
刪除索引
use world;show index from city;
mysql 批量刪除索引
alter table city drop index idx_name;alter table city drop index idx_c_p;alter table city drop index idx_dis;