索引其實就是乙個檔案,它與mysql資料檔案不一樣的地方是:它是順序的儲存資料,檔案小且儲存的位置也不一樣;
索引能加快檢索,但系統每一次維護資料(寫入、更新)的同時也需要維護索引,帶來額外的開銷。
索引按照底層實現方式分為:b樹索引、r樹索引、雜湊索引等;
索引按照具體表現分為:主鍵索引(primary key)、唯一索引(unique)、單列索引(index)、全文索引(fulltext)、空間索引等;
單列索引又可分為:聯合索引(也叫多列索引 | 復合索引)、字首索引、覆蓋索引;
* 查詢未被使用的索引(mysql 5.6?)
使用sql語句查詢,然後檢視索引使用次數,關注使用次數少的索引,按需刪除:* 刪除重複和冗餘的索引select object_schema,object_name,index_name,b.`table_rows`
from performance_schema.table_io_waits_summary_by_index_usage a
join information_schema.tables b
on a.`object_schema`=b.`table_schema` and a.`object_name`=b.`table_name`
where index_name is not null
and count_star = 0
order by object_schema,object_name;
可以使用 pt-duplicate-key-checker 工具檢視重複的索引* 更新索引統計資訊
使用sql語句優化:* 減少索引碎片analyze table table_name
使用sql語句優化,會導致鎖表,慎用:* 導致mysql放棄使用索引的情況 * 使用索引的誤區 * 只建立你確實需要的索引;optimize table table_name
* 每張表的主索引應該盡可能短;
* 索引的選擇性不能太低,這會導致查詢優化器放棄使用索引,如性別;
索引的選擇性是不重複的索引值與表的記錄數的比值,索引的選擇性越高檢索效率越高。* 索引列上不能使用表示式或函式;例:乙個表只有一列,共有4行資料,分別為:a | a | b | b,則選擇性為 2/4=0.5 // 低
如果4行資料分別為:a | b | c | d,則選擇性為 4/4=1 // 高
例如:sql語句 where to_days(out_date)-to_days(current_date) <= 30 應改為 where out_date <= date_add(...) 這樣的形式* 如果乙個索引在頭幾個字元上有唯一的字首,使用字首索引比較好,長字串也使用字首索引;
* 使用聯合索引(多列索引)時,應合理的選擇第一列
1> 經常會被使用的列優先;* 合理使用雜湊索引2> 選擇性高的列優先;
3> 寬度小的列優先;
使用雜湊索引有一些注意事項:*不要給選擇性低的列建單列索引,因為mysql可能會放棄使用索引1:一般用於使用=或<=>操作符的等式比較(很快)。發現範圍值的時候就會比較慢;
2:優化器不能使用hash索引來加速order by操作,因為雜湊索引不是順序的儲存資料的;
* 盡量使用聯合索引(復合索引)
* 單錶的索參數量不要太多,最好不要超過5個
* 使用覆蓋索引時避免「select * ...」 應查詢覆蓋索引中的列,因為可以直接從索引檔案裡提取資料
MySQL優化 之 索引
四種索引 主鍵索引,唯一索引,普通索引,全文索引 對查詢語句會提高效率 對增刪改語句會降低效率,因為還要對索引進行增刪改!建立索引會佔磁碟空間 對頻繁查詢的字段應建立索引,對頻繁更新的字段不適合建立索引 1 新增 1.1 主鍵索引新增 1.當一張表,把某個列設為主鍵的時候,則該列就是主鍵索引 cre...
效能優化之mysql索引優化
sql及索引優化 如何通過慢查詢日誌發現有問題的sql?查詢次數多且每次查詢占用時間長的sql 通常為pt query digest分析的前幾個查詢 io大的sql 注意pt query digest分析中的rows examine項 未命中索引的sql 注意pt query digest分析中ro...
mysql 索引優化器 Mysql之查詢優化器
對於乙個sql語句,查詢優化器先看是不是能轉換成join,再將join進行優化 優化分為 1.條件優化 2.計算全表掃瞄成本 3.找出所有能用到的索引 4.針對每個索引計算不同的訪問方式的成本 5.選出成本最小的索引以及訪問方式 開啟查詢優化器日誌 開啟 set optimizer trace en...