数据库07
索引
索引是一種單獨的物理層面的數(shù)據(jù)結構,其作用是用于加速查詢
mysql把數(shù)據(jù)存儲到硬盤中,硬盤讀寫速度非常慢
一個應用程序,本質上就是對數(shù)據(jù)進行增刪改查
一旦數(shù)據(jù)量比較大時,硬盤的響應速度變慢,給用戶的感覺應用程序非常的慢
查詢操作是應用程序使用中頻率最高的操作
索引最終目的就是要提升查詢速度
索引帶來的問題:
1 添加索引后,整體的數(shù)據(jù)更多了(占用額外的磁盤空間)
2 由于有了索引,多數(shù)數(shù)據(jù)的添加修改刪除,都會引發(fā)索引的重建(使增刪改的效率降低)
索引不是越多越好
索引的實現(xiàn):
查詢之所以慢的原因,數(shù)據(jù)量大是一個問題
但最核心的問題就是硬盤IO操作速度問題
mysql通過B+樹結構來組織數(shù)據(jù)
IO操作有一個預讀的優(yōu)化機制:操作系統(tǒng)會將相鄰的數(shù)據(jù)也讀取到內存中,來減少讀取次數(shù)
mysql 通過B+樹這種結構來減少IO操作
B+樹種每一個磁盤塊有兩個數(shù)據(jù)項,三個地址,在查詢時會比較大小
如果小于左邊就訪問左邊的磁盤塊,如果大于右邊就訪問右邊的磁盤塊否則就訪問中間的磁盤塊,與二分法相同,只不過每次把數(shù)據(jù)分成三段
聚集索引(主鍵)
主鍵索引,速度快因為只要根據(jù)id找到葉子節(jié)點
那么該行的所有數(shù)據(jù)都拿到了
innoDB需要用主鍵索引來建立數(shù)據(jù)結構,索引每一個表都應該有主鍵
輔助索引
除了主鍵索引之外的所有索引都是負責索引
輔助索引會單獨創(chuàng)建樹結構,其中存儲索引數(shù)據(jù)本身以及該數(shù)據(jù)對應主鍵值
查找過程中肯定出現(xiàn)的情況
覆蓋索引:是在當前樹結構中就拿到了所有需要的數(shù)據(jù)
回表:是在負責索引中沒有查詢到需要的數(shù)據(jù),就需要拿著id回到主鍵索引中查找
在編寫sql時,如果有主鍵值,優(yōu)先使用主鍵來查詢
如果沒有主鍵值,需要用輔助索引,盡量少查字段
最好保證需要的數(shù)據(jù)就在輔助索引中,避免使用select *
索引的優(yōu)化,分為兩方面
1 索引結構的優(yōu)化
數(shù)據(jù)量小的,重復度低的做索引
2 sql語句的優(yōu)化
sql語句中條件應該是索引字段
避免在模糊匹配中,在第一個字符使用%
不要對主鍵進行運算
3 and 與 or
在and語句紅mysql會優(yōu)化查詢帶有索引的字段,無論書寫位置,都會先找主鍵
or語句不會自動選擇索引,需要避免使用or語句
4 多字段聯(lián)合索引
如果要查詢的字段教多,為每一個字段都創(chuàng)建索引會造成額外的容量的占用并且當你修改一條記錄時又可能索引都需要重建,會非常慢
建立多字段聯(lián)合索引中順序是重點
創(chuàng)建索引是,把重復度低的字段放在最左邊,依次排開
編寫sql語句時,保證重復度低的字段出現(xiàn)在sql語句中即可
創(chuàng)建索引語法
create index 索引的名字 on 表名(字段名);
刪除索引
drop index 索引名字 on 表名;
轉載于:https://www.cnblogs.com/LinChengcheng/p/10573832.html
總結
- 上一篇: 当前读与快照读
- 下一篇: SQL 查询--日期条件(今日、昨日、本