索引是幫助mysql高效獲取資料的排好序的資料結構,根據索引找到儲存位址
索引資料結構
二叉樹紅黑樹
hash表
b-tree
二叉樹:
樹(tree)是n(n>=0)個結點的有限集。n=0時稱為空樹。在任意一顆非空樹中:
1)有且僅有乙個特定的稱為根(root)的結點;
2)當n>1時,其餘結點可分為m(m>0)個互不相交的有限集t1、t2、......、tn,其中每乙個集合本身又是一棵樹,並且稱為根的子樹。
此外,樹的定義還需要強調以下兩點:
1)n>0時根結點是唯一的,不可能存在多個根結點,資料結構中的樹只能有乙個根結點。
2)m>0時,子樹的個數沒有限制,但它們一定是互不相交的。
示例樹:
紅黑樹:
自平衡,不同於二叉樹。如果二叉樹都是遞增的元素的時候,那麼就會變成單向的鏈式結構。
hash表:
hash索引僅僅能滿足「=」,「in」,「<=>」查詢,不能使用範圍查詢。
聯合索引中,hash索引不能利用部分索引鍵查詢。
對於聯合索引中的多個列,hash是要麼全部使用,要麼全部不使用,並不支援btree支援的聯合索引的最優字首,也就是聯合索引的前面乙個或幾個索引鍵進行查詢時,hash索引無法被利用。
hash索引無法避免資料的排序操作
由於hash索引中存放的是經過hash計算之後的hash值,而且hash值的大小關係並不一定和hash運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算。
hash索引任何時候都不能避免表掃瞄
hash索引是將索引鍵通過hash運算之後,將hash運算結果的hash值和所對應的行指標資訊存放於乙個hash表中,由於不同索引鍵存在相同hash值,所以即使滿足某個hash鍵值的資料的記錄條數,也無法從hash索引中直接完成查詢,還是要通過訪問表中的實際資料進行比較,並得到相應的結果。
hash索引遇到大量hash值相等的情況後效能並不一定會比btree高
對於選擇性比較低的索引鍵,如果建立hash索引,那麼將會存在大量記錄指標資訊存於同乙個hash值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料訪問,而造成整體效能底下。
btree:
不同於紅黑樹,除了自平衡外,葉子節點可以存在多個元素,最多為16k。但是key value存在一塊會導致整個葉子節點的存量變大。
它會將某個葉子節點load到記憶體中進行比較,從而確定某個值。並且葉子節點的值是從鏈式結構順序排序的
btree+:
b+tree 在btree樹上做了改造。葉節點不在儲存value,置儲存冗餘的葉節點,這樣保證子節點全部存在在最底層。鏈式結構能包圍,每個葉節點可以儲存的key也增加了。方便做範圍查詢。
mysql查詢
explain中的列 接下來我們將展示 explain 中每個列的資訊。
1. id列 id列的編號是 select 的序列號,有幾個 select 就有幾個id,並且id的順序是按 select 出現的 順序增長的。 id列越大執行優先順序越高,id相同則從上往下執行,id為null最後執行。
2. select_type列 select_type 表示對應行是簡單還是複雜的查詢。
1)******:簡單查詢。查詢不包含子查詢和union mysql> explain select * from film where id = 2;
2)primary:複雜查詢中最外層的 select subquery:
3) 包含在 select 中的子查詢(不在 from 子句中)
4)derived:包含在 from 子句中的子查詢。mysql會將結果存放在乙個臨時表中,也稱為 派生表(derived的英文含義) 用這個例子來了解 primary、subquery 和 derived 型別
用這個例子來了解 primary、subquery 和 derived 型別
mysql> set session optimizer_switch='derived_merge=off'; #關閉mysql5.7新特性對衍 生表的合併優化
mysql> explain select (select 1 from actor where id = 1) from (select * from film where id = 1) der;
5)union:在 union 中的第二個和隨後的 select mysql> explain select 1 union all select 1;
測試只是一部分
對於很多測試人員來說,測試相關的內容是工作的全部,這是我們的視角。但是換個角度也許就不是這樣。首先我們工作的地方大部分是商業組織,是某個公司,開發某類產品或者提供某類服務,也就是business。所以從組織的層級往上看,到了一定的級別,其實看到的是業務 產品等東西,當然他們也關心我們技術和競爭對手的...
Laravel 一部分總結
1.使用命令自動建立model層 進入所在目錄 php artisan make model test 2增刪改查 toarray 將資料變成陣列 public functionusertest 增 預設有兩個字段,可以在model層關閉,或者在表中新增 public timestamps fals...
測試只是一部分
對於很多測試人員來說,測試相關的內容是工作的全部,這是我們的視角。但是換個角度也許就不是這樣。首先我們工作的地方大部分是商業組織,是某個公司,開發某類產品或者提供某類服務,也就是business。所以從組織的層級往上看,到了一定的級別,其實看到的是業務 產品等東西,當然他們也關心我們技術和競爭對手的...