MyISAM與InnoDB存儲引擎性能比較

簡介

存儲引擎 desc
MyISAM 高速引擎,查詢速度快,但不支持事務
InnoDB 5.5版本後MySql默認數據庫,支持事務和行級鎖,速度比MyISAM慢
- InnoDB MyISAM
存儲文件 .frm 表定義文件.ibd 數據文件和索引文件 .frm 表定義文件 .myd 數據文件 .myi 索引文件
表鎖、行鎖 表鎖
事務 支持 不支持
CRUD 讀、寫 讀多
count查詢 掃表 有專門存儲的地方
索引結構 B+Tree B+Tree
索引類型 聚簇索引:數據和索引在一起 非聚簇索引:數據和索引分開
葉子節點 記錄完整的數據 記錄數據的地址值

性能分析思路

  1. 首先使用【慢查詢日誌】功能,去獲取所有查詢時間比較長的sql
  2. 其次【查看執行計劃】查看有問題的sql執行計劃
  3. 最後使用【show profiles[s]】 查看有問題的sql性能使用個情況
  4. 具體步驟:
  5. 打開mysql命令行:show variables like ‘%slow%’; set global slow_query_log = 1
  6. 打開mysql命令行:show variables like ‘%profiling%’;
  7. set profiling = 1;
  8. 執行sql:show profiles; 獲取id
  9. 執行sql:show profile all for query (id)

索引思路

索引有什麼用

  1. 高效獲取數據的數據結構
  2. 使用b+tree結構
  3. 索引是存儲在磁盤文件中的(MyISAM 存儲在單獨的.myi文件,InnoDB存儲在數據文件一起.ibd)

聚簇索引(Cluster Index) InnoDB

InnoDB存儲引擎的數據組織方式是聚簇索引表:完整的記錄存儲在主鍵索引中,通過主鍵索引就可以獲取記錄所有的列,也就表數據和索引是在一起的。

索引的優勢和劣勢

優勢

  1. 可以提高數據檢索的效率,降低數據庫的IO成本,類似於書的目錄
  2. 通過索引列對數據進行排序,降低數據排序成本,降低cpu消耗

劣勢

  1. 佔用磁盤空間
  2. 雖然能提高查詢效率,但是會降低更新數據的效率

關於主鍵索引和輔助索引(次要索引)

InnoDB(聚簇索引cluster index)

主鍵索引:葉子節點會存儲數據行,
輔助索引:葉子節點會存儲主鍵值,然後再通過主鍵值進行數據檢索,會進行二次索引。

MyISAM非聚簇索引

主鍵索引:葉子節點會存儲數據地址值
輔助索引:葉子節點也會存儲數據地址值

多使用組合索引

  1. 常出現在where條件中的列,用組合索引,至於組合索引中的順序很重要,需要匹配最左前綴原則,但是由於mysql中存在查詢優化器,所以書寫的sql條件順序不一定是執行時候的where條件順序
  2. 常出現在order by 和group by語句中的列,最後按照順序去創建組合索引
  3. 常出現在select 語句中的列,建議按照順序創建組合索引,多用覆蓋索引,少用*作爲結果
  4. 最左匹配原則,mysql會一直向右匹配直到遇到範圍查詢(>,<,between,like,%,or)就停止匹配
  5. = 和 in 可以亂序,比如 a = 1 and b=2 and c= 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會優化成索引可以識別的形式

EXPLAIN sql性能分析

  1. id
  2. select_type
  3. table
  4. partitions
  5. type:system,const,eq_ref,ref,fulltext,ref_or_null,nuique_subquery,index_subquery,range,index_merge,index,all(除了all 都用到了索引,除了index_merge其他只可以用到一個索引,最少要用到range級別)
  6. possible_keys 此次查詢中可能選中到的索引數量
  7. key
  8. ref
  9. rows 估算的掃描行數(innodb不是精確值,myisam是精確值)
  10. filtered
  11. extra

mysql性能優化

  1. 將數據保存到內存中,保證從內存讀取數據
  2. 內存預熱
  3. 設計中間表
  4. 減少關聯查詢,創建合理的冗餘字段
  5. 字段太多時,考慮垂直拆表
  6. 將字段內容很多的字段單獨拆解一個表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章