Mysql索引概念:
說說Mysql索引,看到一個不多好比:索引就比如一本書的目錄,它會讓你更快的找到內容,顯然目錄(索引)並非越多越好,假如這本書1000頁,有500也是目錄,它固然效率低,目錄是要佔紙張的,而索引是要佔磁盤空間的。node
Mysql索引主要有兩種結構:B+Tree索引和Hash索引.mysql
Hash索引sql
MySQL中,只有Memory(Memory表只存在內存中,斷電會消失,適用於臨時表)存儲引擎顯示支持Hash索引,是Memory表的默認索引類型,儘管Memory表也可使用B+Tree索引。hsah索引把數據的索引以hash形式組織起來,所以當查找某一條記錄的時候,速度很是快。當時由於是hash結構,每一個鍵只對應一個值,並且是散列的方式分佈。因此他並不支持範圍查找和排序等功能。數據庫
B+樹索引緩存
B+tree是mysql使用最頻繁的一個索引數據結構,是Inodb和Myisam存儲引擎模式的索引類型。相對Hash索引,B+樹在查找單條記錄的速度比不上Hash索引,可是由於更適合排序等操做,因此他更受用戶的歡迎。畢竟不可能只對數據庫進行單條記錄的操做。數據結構
帶順序訪問指針的B+Tree性能
B+Tree全部索引數據都在葉子結點上,而且增長了順序訪問指針,每一個葉子節點都有指向相鄰葉子節點的指針。
這樣作是爲了提升區間查詢效率,例如查詢key爲從18到49的全部數據記錄,當找到18後,只需順着節點和指針順序遍歷就能夠一次性訪問到全部數據節點,極大提到了區間查詢效率。優化
大大減小磁盤I/O讀取spa
數據庫系統的設計者巧妙利用了磁盤預讀原理,將一個節點的大小設爲等於一個頁,這樣每一個節點只須要一次I/O就能夠徹底載入。設計
爲了達到這個目的,在實際實現B- Tree還須要使用以下技巧:
每次新建節點時,直接申請一個頁的空間,這樣就保證一個節點物理上也存儲在一個頁裏,加之計算機存儲分配都是按頁對齊的,就實現了一個node只需一次I/O。
B-Tree中一次檢索最多須要h-1次I/O(根節點常駐內存),漸進複雜度爲O(h)=O(logdN)。通常實際應用中,出度d是很是大的數字,一般超過100,所以h很是小(一般不超過3)。而紅黑樹這種結構,h明顯要深的多。因爲邏輯上很近的節點(父子)物理上可能很遠,沒法利用局部性,因此紅黑樹的I/O漸進複雜度也爲O(h),效率明顯比B-Tree差不少。
一、選擇索引的數據類型
MySQL支持不少數據類型,選擇合適的數據類型存儲數據對性能有很大的影響。一般來講,能夠遵循如下一些指導原則:
(1)越小的數據類型一般更好:越小的數據類型一般在磁盤、內存和CPU緩存中都須要更少的空間,處理起來更快。
(2)簡單的數據類型更好:整型數據比起字符,處理開銷更小,由於字符串的比較更復雜。在MySQL中,應該用內置的日期和時間數據類型,而不是用字符串來存儲時間;以及用整型數據類型存儲IP地址。
(3)儘可能避免NULL:應該指定列爲NOT NULL,除非你想存儲NULL。在MySQL中,含有空值的列很難進行查詢優化,由於它們使得索引、索引的統計信息以及比較運算更加複雜。你應該用0、一個特殊的值或者一個空串代替空值。
二、選擇主鍵類型
選擇合適的標識符是很是重要的。選擇時不只應該考慮存儲類型,並且應該考慮MySQL是怎樣進行運算和比較的。一旦選定數據類型,應該保證全部相關的表都使用相同的數據類型。
(1) 整型:一般是做爲標識符的最好選擇,由於能夠更快的處理,並且能夠設置爲AUTO_INCREMENT。
(2) 字符串:儘可能避免使用字符串做爲標識符,它們消耗更好的空間,處理起來也較慢。並且,一般來講,字符串都是隨機的,因此它們在索引中的位置也是隨機的,這會致使頁面分裂、隨機訪問磁盤,聚簇索引分裂(對於使用聚簇索引的存儲引擎)。
Mysql常見索引有:主鍵索引、惟一索引、普通索引、全文索引、組合索引
PRIMARY KEY(主鍵索引) ALTER TABLE `table_name` ADD PRIMARY KEY ( `col` )
UNIQUE(惟一索引) ALTER TABLE `table_name` ADD UNIQUE (`col`)
INDEX(普通索引) ALTER TABLE `table_name` ADD INDEX index_name (`col`)
FULLTEXT(全文索引) ALTER TABLE `table_name` ADD FULLTEXT ( `col` )
組合索引 ALTER TABLE `table_name` ADD INDEX index_name (`col1`, `col2`, `col3` )
Mysql各類索引區別:
普通索引:最基本的索引,沒有任何限制
惟一索引:與"普通索引"相似,不一樣的就是:索引列的值必須惟一,但容許有空值。
主鍵索引:它 是一種特殊的惟一索引,不容許有空值。
全文索引:僅可用於 MyISAM 表,針對較大的數據,生成全文索引很耗時好空間。
組合索引:爲了更多的提升mysql效率可創建組合索引,遵循」最左前綴「原則。建立複合索引時應該將最經常使用(頻率)做限制條件的列放在最左邊,依次遞減。
組合索引最左字段用in是能夠用到索引的,最好explain一下select。