Mysql索引使用的數據結構主要有 BTree索引 和 Hash索引。對於Hash索引來講,底層數據結構就是哈希表,所以在絕大多數需求爲單條記錄查詢的時候,使用Hash索引查詢性能最快。其他大多數場景建議使用BTree索引。html
MySQL的基本存儲結構爲 頁 ,頁與頁之間使用雙向鏈表進行連接,頁內記錄使用單向鏈表進行連接。查詢數據時,先使用雙向鏈表查詢到數據所在的頁,頁內查詢時,where子句中若是是主鍵則根據二分查找進行查詢,若是爲非主鍵則使用遍歷鏈表的方式進行查詢。整個時間複雜度爲O(n)。面試
使用索引以後,能夠利用BTree的數據結構進行查找數據,時間複雜度能夠作到O(log n)。sql
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )
複製代碼
ALTER TABLE `table_name` ADD UNIQUE ( `column` )
複製代碼
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )
複製代碼
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)
複製代碼
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
複製代碼
簡單來說,創建聯合索引時,當最左邊的一個或多個索引肯定以後,緊跟着的索引纔是有序的。(以下圖,創建a,b的聯合索引後,a的值爲[1,1,2,2,3,3]有序,b的值爲[1,2,1,4,1,2])當不肯定a的值時,b的值在結構上是無序的,這時僅where子查詢中若是隻使用b進行查找則會全表查找。 因此當咱們用
where a = 1 and b = 2
進行查詢時,因爲a肯定以後b的值有序,因此b字段查詢時使用上索引。當咱們用where a > 1 and b = 2
進行查詢時,a字段可使用索引,但b字段因爲無序因此沒法使用索引。數據庫
簡單歸納數據結構
- 彙集索引就是以主鍵建立的索引
- 非彙集索引就是以非主鍵建立的索引
兩者區別post
where like '%索引'
沒法使用索引Select * fromuser where phone=13800001234
select id,name from product limit 866613, 20
使用上述SQL語句作分頁的時候,可能有人會發現,隨着表數據量的增長,直接使用limit分頁查詢會愈來愈慢。優化的方法以下:能夠取前一頁的最大行數的id,而後根據這個最大的id來限制下一頁的起點。好比此列中,上一頁最大的id是866612。SQL能夠採用以下的寫法:select id,name from product where id> 866612 limit 20。
Q:請說說索引的注意事項,或者說說索引的優缺點。性能