##什麼是索引數據庫
索引是一種文件,一種特殊的文件,索引文件中存放整張表全部記錄的引用指針,至關於書本的目錄。數據庫設計
聚簇索引是按照數據存放的物理位置爲順序的性能
非聚簇索引,葉級頁指向表中的記錄,記錄的物理順序與邏輯順序沒有必然聯繫測試
聚簇索引相對來講對於多行索引的性能提升比較大,而非聚簇索引對於單行檢索比較快優化
普通索引(INDEX) 最基本的索引,無任何限制,MyISAM中默認BTREE類型索引設計
惟一索引(UNIQUE) 與普通索引相似,但惟一索引的索引列的值必須惟一,容許空值,若爲組合索引,列值組合必 須惟一指針
全文索引(FULLTEXT) 僅可用於MyISAM引擎的表,在生成全文索引時數據庫將會吧文本中出現的全部單詞建立爲一 份清單,查詢操做將會根據這份清單去檢索有關的數據記錄,可是對於大容量的數據表,生成 全文索引是一種很是消耗時間與存儲空間的作法code
單列索引、多列索引 多個單列索引與與單個多列索引查詢效果不一樣,執行查詢時MySQL只能使用一個索引,會從多 個索引中選擇一個限制最爲嚴格的索引排序
組合索引(最左前綴) 組合索引時從最左面開始組合,組成一組組索引,例如索引
ALTER TABLE article ADD INDEX index_time_time(title(50),time(10))
那麼此時至關於創建瞭如下兩組索引
SELECT * FROM article WHERE title='測試' AND time=123456789; SELECT * FROM article WHERE title='測試';
不使用上面的索引的查詢語句以下
SELECT * FROM article WHERE time=123456789;
索引雖然能提升MySQL的查詢速度,可是當咱們進行insert、update、delete等寫操做時,速度會有所下降,由於在寫數據時一樣須要更新保存索引文件。
動做描述 | 使用匯集索引 | 使用非彙集索引 |
---|---|---|
常常被分組排序 | 使用 | 使用 |
返回某一範圍內的數據 | 使用 | 不使用 |
一個或極少不一樣值 | 不使用 | 不使用 |
小數目的不一樣值 | 使用 | 不使用 |
大數目的不一樣值 | 不使用 | 使用 |
頻繁更新的列 | 不使用 | 使用 |
外鍵列 | 使用 | 使用 |
主鍵列 | 使用 | 使用 |
頻繁修改索引列 | 不使用 | 使用 |
select * from users where YEAR(adddate)<2007;將在每一個行上進行運算,這將致使索引失效而進行全表掃描,所以咱們能夠改爲:
select * from users where adddate<’2007-01-01′;關於這一點能夠圍觀:一個單引號引起的MYSQL性能損失
- MySQL將全部數據邏輯存放與ibdata1文件中,該文件也被稱爲表空間,表空間又劃分非段(數據段,索引段,回滾段),每一個段又劃分爲區,每一個區大小爲1M,InnoDB每次最多隻能申請4個區,即4M,每一個區分爲64頁,每頁16KB,這個大小是固定的
- InnoDB 是面向行的,也意味着數據行將存放與頁中,每頁最多7992行