Mysql(MyISAM和InnoDB)及Btree和索引優化


MYSQL

一、引擎

mysql:MySQL是一個關系型數據庫管理系統,其中有兩種引擎最為常見MyISAM和InnoDB

MyISAM(非聚集索引)     MySQL 5.0 之前的默認數據庫引擎,最為常用。擁有較高的插入,查詢速度,但不支持事務

 

InnoDB(聚集索引)     事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定, MySQL 5.5 起成為默認數據庫引擎
 


 

 
二、MYSQL索引:Btree索引結構。
   B-Tree 索引是 MySQL 數據庫中使用最為頻繁的索引類型,除了 Archive 存儲引擎之外的其他所有的存儲引擎都支持 B-Tree 索引。
   btree索引:通俗點說就是一顆二叉樹
     (圖為百度出來的圖,如有侵權,請私信告訴我。我只是為了讓Btree更加淺顯易懂,重點是我畫得難看。TOT)
通俗得來說:如取35為節點,比35小的就放左邊,比35大的就放右邊。如果我們要尋找87葉子節點的位置,87比35大,所以在右邊,然后87比39還大,所以還在右邊,比65還大,所以還在右邊,一共尋找3次。

Question

說到Btree索引,一直以來都有個通俗問題:對於hash索引, 索引的檢索可以一次定位,不像B-Tree 索引需要從根節點到枝節點,檢索效率比Btree高很多,那為什么不用Hash索引卻要用Btree索引?
Answer:
有以下幾點原因: Hash 索引僅僅能滿足"=","IN"和"<=>"查詢,不能使用范圍查詢。
        Hash 索引無法被用來避免數據的排序操作。
        Hash 索引在任何時候都不能避免表掃描。
        Hash 索引遇到大量Hash值相等的情況后性能並不一定就會比B-Tree索引高。
        (hash 在mylsam數據表存儲是范圍存放,只按照節點查找,一旦多個hash值索引節點,那么就要在數據表多個位置尋找,比InnoDB中索引和數據在同一節點尋找復雜得多,所以不推薦hash)(括號的是我總結,不一定對。有錯可以指出,我會修改)
 
三、聚集索引及其碎片維護

  (InnoDB)聚簇結構的特點:

  • 根據主鍵查詢條目時,不用回行(數據就在主鍵節點下)
  • 如果碰到不規則數據插入時,造成頻繁的頁分裂

  為什么會產生頁分裂?

這是因為聚簇索引采用的是平衡二叉樹算法,而且每個節點都保存了該主鍵所對應行的數據,假設插入數據的主鍵是自增長的,那么根據二叉樹算法會很快的把該數據添加到某個節點下,而其他的節點不用動;但是如果插入的是不規則的數據,那么每次插入都會改變二叉樹之前的數據狀態。從而導致了頁分裂。

  優化:

聚簇索引的主鍵值,應盡量是連續增長的值,而不是要是隨機值, (不要用隨機字符串或UUID),否則會造成大量的頁分裂與頁移動。在使用InnoDB的時候最好定義成:

id int unsigned primary key auto_increment

 

 

 

 

索引選擇性與前綴索引

因為索引雖然加快了查詢速度,但索引也是有代價的,另外,MySQL在運行時也要消耗資源維護索引,因此索引並不是越多越好

一般兩種情況下不建議建索引。
1.表記錄比較少,超過2000條可以酌情考慮索引。
2.索引的選擇性較低。所謂索引的選擇性(Selectivity),是指不重復的索引值(也叫基數,Cardinality)與表記錄數(#T)的比值:
Index Selectivity = Cardinality / #T

顯然選擇性的取值范圍為(0, 1],選擇性越高的索引價值越大,這是由B+Tree的性質決定的。

使用索引掃描來優化排序條件
1.索引的列順序和Order by子句的順序完全一致
2.索引中所有列的方向(升序,降序)和Order by子句完全一致
3.Order by中的字段全部在關聯表中的第一張表中

 四、MYSQL 優化命令查詢

1、查版本號

無論做什么都要確認版本號,不同的版本號下會有各種差異。

>Select  version();

 

2、執行狀態分析

顯示哪些線程正在運行

>show processlist;   (端口號給我馬賽克了,見諒見諒,安全起見)

 

 

3、Show profile

精確兩位數,小數點。

show profile默認的是關閉的,但是會話級別可以開啟這個功能,開啟它可以讓MySQL收集在執行語句的時候所使用的資源。

分析SQL執行帶來的開銷是優化SQL的常用手段,在MySQL數據庫中,可以通過配置profiling參數來啟用SQL剖析。
它只能在session級別來設置,設置后影響當前session;當它開啟后,后續執行的SQL語句都將記錄其資源開銷,諸如IO,上下文,CPUMEMORY等。

開啟profiling,有個警告,這個參數在以后會被刪除,用information_scheam.PROFILING替代。

  (設置profiling=1,開啟profile)

  (使用命令:show profile 觀看執行時間,15行受影響)

根據query id查看某個查詢得詳細時間耗時。

 

Explain的列分析

如查詢語句:

查詢語句是explain select * from goods order by goods_id asc \G

 

 

 

 

 
 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM