本文目錄一覽:
MySQL 索引是怎麼實現的?
索引是滿足某種特定查找算法的數據結構,而這些數據結構會以某種方式指向數據,從而實現高效查找數據。
具體來說 MySQL 中的索引,不同的數據引擎實現有所不同,但目前主流的數據庫引擎的索引都是 B+ 樹實現的,B+ 樹的搜索效率,可以到達二分法的性能,找到數據區域之後就找到了完整的數據結構了,所有索引的性能也是更好的。
Mysql建立索引經驗
在實際開發中使用數據庫時,難免會遇到一些大表數據,對這些數據進行查詢時,有時候SQL會查詢得特別慢,這時候,有經驗的老師傅會告訴你,你看一下哪幾個字段查的多,加一個索引就好了。
那麼,怎麼合理地建立索引呢?這裡分享一下我的一些經驗,如有不妥之處,歡迎批評指正。
1、不要盲目建立索引 , 先分析再創建
索引雖然能大幅度提升我們的查詢性能,但也要知道,在你進行增刪改時,索引樹也要同樣地進行維護。所以,索引不是越多越好,而是按需建立。最好是在一整塊模塊開發完成後,分析一下,去針對大多數的查詢,建立聯合索引。
2、使用聯合索引盡量覆蓋多的條件
這是說在一個慢sql里假如有五個where ,一個 order by ,那麼我們的聯合索引盡量覆蓋到這五個查詢條件,如果有必要,order by 也覆蓋上 。
3、小基數字段不需要索引
這個意思是,如果一張表裡某個字段的值只有那麼幾個,那麼你針對這個字段建立的索引其實沒什麼意義,比如說,一個性別字段就兩種結果,你建了索引,排序也沒什麼意思(也就是索引里把男女給分開了)
所以說,索引盡量選擇基數大的數據去建立,能最大化地利用索引
4、長字符串可以使用前綴索引
我們建立索引的字段盡量選擇字段類型較小的,比如一個varchar(20)和varchar(256)的,我們在20的上面建立的索引和在256上就有明顯的差距(字符串那麼長排序也不好排呀,唉)。
當然,如果一定是要對varchar(256)建立索引,我們可以選擇裡面的前20個字符放在索引樹里(這裡的20不絕對,選擇能盡量分辨數據的最小字符字段設計),類似這樣KEY index(name(20),age,job) ,索引只會對name的前20個字符進行搜索,但前綴索引無法適用於order by 和 group by。
5、對排序字段設計索引的優先級低
如果一個SQL里我們出現了範圍查找,後邊又跟着一個排序字段,那麼我們優先給範圍查找的字段設置索引,而不是優先排序。
6、如果出現慢SQL,可以設計一個只針對該條SQL的聯合索引。
不過慢SQL的優化,需要一步步去進行分析,可以先用explain查看SQL語句的分析結果,再針對結果去做相應的改進。explain的東西我們下次再講。
PS:在 select 語句之前增加 explain 關鍵字,MySQL 會在查詢上設置一個標記,執行查詢會返回執行計劃的信息,而不是 執行這條SQL。
mysql索引
二叉搜索樹、N叉樹
頁分裂:B+樹的插入可能會引起數據頁的分裂,刪除可能會引起數據頁的合併,二者都是比較重的IO消耗,所以比較好的方式是順序插入數據,這也是我們一般使用自增主鍵的原因之一。
頁分裂逆過程:頁合併,當刪除數據後,相鄰的兩個數據頁利用率很低的時候會做數據頁合併
主鍵索引:key:主鍵,value:數據頁,存儲每行數據
非主鍵索引:key:非主鍵索引,value:主鍵key,導致回表
最左匹配:優先將區分度高的列放到前面,這樣可以高效索引,
最左匹配原則遇到範圍查詢就停止匹配,範圍查詢(、、between、like)為什麼?因為出現範圍匹配後,後面的索引字段無法保證有序,局部有序失去,順序失去則無法提高查詢效率
SELECT * FROM table WHERE a IN (1,2,3) and b 1;
如何建立索引?
還是對(a,b)建立索引,因為IN在這裡可以視為等值引用,不會中止索引匹配,所以還是(a,b)!
索引組織表
索引用頁存儲:key【10】-point【6】,通過調整key大小,當頁大小固定的情況下,通過調整key大小,使得N叉樹變化;
如key 10, point 6則單個索引16字節,頁大小為16k,則頁面總共可以存儲1024個索引,即N大小
覆蓋索引: 二級索引的信息已經存在想要的列,例如主鍵
如果現在有一個高頻請求,要根據市民的身份證號查詢他的姓名,這個聯合索引就有意義了。它可以在這個高頻請求上用到覆蓋索引,不再需要回表查整行記錄,減少語句的執行時間。
索引下推優化:可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數。
整理索引碎片,重建表:alter table T engine=InnoDB
首先是看key的大小,另外是數據頁的大小,如果需要改變N,則需要從這兩個方面做改動;
一個innoDB引擎的表,數據量非常大,根據二級索引搜索會比主鍵搜索快,文章闡述的原因是主鍵索引和數據行在一起,非常大搜索慢,我的疑惑是:通過普通索引找到主鍵ID後,同樣要跑一邊主鍵索引,對於使用覆蓋索引的情況下,使用覆蓋索引可以直接解決問題
mysql索引是如何實現的
1.添加PRIMARY KEY(主鍵索引)
mysqlALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
2.添加UNIQUE(唯一索引)
mysqlALTER TABLE `table_name` ADD UNIQUE ( `column` )
3.添加INDEX(普通索引)
mysqlALTER TABLE `table_name` ADD INDEX index_name ( `column` )
4.添加FULLTEXT(全文索引)
mysqlALTER TABLE `table_name` ADD FULLTEXT ( `column`)
5.添加多列索引
mysqlALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/199021.html