Mysql索引學習

##什麼是索引數據庫

索引是一種文件,一種特殊的文件,索引文件中存放整張表全部記錄的引用指針,至關於書本的目錄。數據庫設計

  • 當沒有索引時,數據庫查找記錄就是便利整張表的記錄
  • 存在索引時數據庫查詢先從相應的索引中查找符合條件的項

索引種類

  1. 聚簇索引

聚簇索引是按照數據存放的物理位置爲順序的性能

  1. 非聚簇索引

非聚簇索引,葉級頁指向表中的記錄,記錄的物理順序與邏輯順序沒有必然聯繫測試

聚簇索引相對來講對於多行索引的性能提升比較大,而非聚簇索引對於單行檢索比較快優化

索引的分類

  1. 普通索引(INDEX) 最基本的索引,無任何限制,MyISAM中默認BTREE類型索引設計

  2. 惟一索引(UNIQUE) 與普通索引相似,但惟一索引的索引列的值必須惟一,容許空值,若爲組合索引,列值組合必 須惟一指針

  3. 全文索引(FULLTEXT) 僅可用於MyISAM引擎的表,在生成全文索引時數據庫將會吧文本中出現的全部單詞建立爲一 份清單,查詢操做將會根據這份清單去檢索有關的數據記錄,可是對於大容量的數據表,生成 全文索引是一種很是消耗時間與存儲空間的作法code

  4. 單列索引、多列索引 多個單列索引與與單個多列索引查詢效果不一樣,執行查詢時MySQL只能使用一個索引,會從多 個索引中選擇一個限制最爲嚴格的索引排序

  5. 組合索引(最左前綴) 組合索引時從最左面開始組合,組成一組組索引,例如索引

    ALTER TABLE article ADD INDEX index_time_time(title(50),time(10))

    那麼此時至關於創建瞭如下兩組索引

    • title,time
    • title 使用到上面的索引的查詢語句以下
    SELECT * FROM article WHERE title='測試' AND time=123456789;
    SELECT * FROM article WHERE title='測試';

    不使用上面的索引的查詢語句以下

    SELECT * FROM article WHERE time=123456789;

索引雖然能提升MySQL的查詢速度,可是當咱們進行insert、update、delete等寫操做時,速度會有所下降,由於在寫數據時一樣須要更新保存索引文件。

索引的優化

動做描述 使用匯集索引 使用非彙集索引
常常被分組排序 使用 使用
返回某一範圍內的數據 使用 不使用
一個或極少不一樣值 不使用 不使用
小數目的不一樣值 使用 不使用
大數目的不一樣值 不使用 使用
頻繁更新的列 不使用 使用
外鍵列 使用 使用
主鍵列 使用 使用
頻繁修改索引列 不使用 使用
  1. 使用短索引 對串列進行索引,若是可能應該指定一個前綴長度。例如,若是有一個CHAR(255)的列, 若是在前10個或20個字符內,多數值是唯一的,那麼就不要對整個列進行索引。短索引不只可 以提升查詢速度並且能夠節省磁盤空間和I/O操做
  2. 索引不會包含有NULL值的列 只要列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那 麼這一列對於此複合索引就是無效的。因此咱們在數據庫設計時不要讓字段的默認值爲NULL
  3. 索引列排序 MySQL查詢只使用一個索引,所以若是where子句中已經使用了索引的話,那麼order by 中的列是不會使用索引的。所以數據庫默認排序能夠符合要求的狀況下不要使用排序操做;儘可能不要包含多個列的排序,若是須要最好給這些列建立複合索引
  4. like語句操做 通常狀況下不鼓勵使用like操做,若是非使用不可,如何使用也是一個問題。like 「%aaa%」 不會使用索引而like 「aaa%」可使用索引
  5. 不要在列上進行運算 例如:
    select * from users where YEAR(adddate)<2007;
    將在每一個行上進行運算,這將致使索引失效而進行全表掃描,所以咱們能夠改爲:
    select * from users where adddate<’2007-01-01′;
    關於這一點能夠圍觀:一個單引號引起的MYSQL性能損失
  1. MySQL將全部數據邏輯存放與ibdata1文件中,該文件也被稱爲表空間,表空間又劃分非段(數據段,索引段,回滾段),每一個段又劃分爲區,每一個區大小爲1M,InnoDB每次最多隻能申請4個區,即4M,每一個區分爲64頁,每頁16KB,這個大小是固定的
  2. InnoDB 是面向行的,也意味着數據行將存放與頁中,每頁最多7992行
相關文章
相關標籤/搜索