簡介
存儲引擎 | desc |
---|---|
MyISAM | 高速引擎,查詢速度快,但不支持事務 |
InnoDB | 5.5版本後MySql默認數據庫,支持事務和行級鎖,速度比MyISAM慢 |
- | InnoDB | MyISAM |
---|---|---|
存儲文件 | .frm 表定義文件.ibd 數據文件和索引文件 | .frm 表定義文件 .myd 數據文件 .myi 索引文件 |
鎖 | 表鎖、行鎖 | 表鎖 |
事務 | 支持 | 不支持 |
CRUD | 讀、寫 | 讀多 |
count查詢 | 掃表 | 有專門存儲的地方 |
索引結構 | B+Tree | B+Tree |
索引類型 | 聚簇索引:數據和索引在一起 | 非聚簇索引:數據和索引分開 |
葉子節點 | 記錄完整的數據 | 記錄數據的地址值 |
性能分析思路
- 首先使用【慢查詢日誌】功能,去獲取所有查詢時間比較長的sql
- 其次【查看執行計劃】查看有問題的sql執行計劃
- 最後使用【show profiles[s]】 查看有問題的sql性能使用個情況
- 具體步驟:
- 打開mysql命令行:show variables like ‘%slow%’; set global slow_query_log = 1
- 打開mysql命令行:show variables like ‘%profiling%’;
- set profiling = 1;
- 執行sql:show profiles; 獲取id
- 執行sql:show profile all for query (id)
索引思路
索引有什麼用
- 高效獲取數據的數據結構
- 使用b+tree結構
- 索引是存儲在磁盤文件中的(MyISAM 存儲在單獨的.myi文件,InnoDB存儲在數據文件一起.ibd)
聚簇索引(Cluster Index) InnoDB
InnoDB存儲引擎的數據組織方式是聚簇索引表:完整的記錄存儲在主鍵索引中,通過主鍵索引就可以獲取記錄所有的列,也就表數據和索引是在一起的。
索引的優勢和劣勢
優勢
- 可以提高數據檢索的效率,降低數據庫的IO成本,類似於書的目錄
- 通過索引列對數據進行排序,降低數據排序成本,降低cpu消耗
劣勢
- 佔用磁盤空間
- 雖然能提高查詢效率,但是會降低更新數據的效率
關於主鍵索引和輔助索引(次要索引)
InnoDB(聚簇索引cluster index)
主鍵索引:葉子節點會存儲數據行,
輔助索引:葉子節點會存儲主鍵值,然後再通過主鍵值進行數據檢索,會進行二次索引。
MyISAM非聚簇索引
主鍵索引:葉子節點會存儲數據地址值
輔助索引:葉子節點也會存儲數據地址值
多使用組合索引
- 常出現在where條件中的列,用組合索引,至於組合索引中的順序很重要,需要匹配最左前綴原則,但是由於mysql中存在查詢優化器,所以書寫的sql條件順序不一定是執行時候的where條件順序
- 常出現在order by 和group by語句中的列,最後按照順序去創建組合索引
- 常出現在select 語句中的列,建議按照順序創建組合索引,多用覆蓋索引,少用*作爲結果
- 最左匹配原則,mysql會一直向右匹配直到遇到範圍查詢(>,<,between,like,%,or)就停止匹配
- = 和 in 可以亂序,比如 a = 1 and b=2 and c= 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會優化成索引可以識別的形式
EXPLAIN sql性能分析
- id
- select_type
- table
- partitions
- type:system,const,eq_ref,ref,fulltext,ref_or_null,nuique_subquery,index_subquery,range,index_merge,index,all(除了all 都用到了索引,除了index_merge其他只可以用到一個索引,最少要用到range級別)
- possible_keys 此次查詢中可能選中到的索引數量
- key
- ref
- rows 估算的掃描行數(innodb不是精確值,myisam是精確值)
- filtered
- extra
mysql性能優化
- 將數據保存到內存中,保證從內存讀取數據
- 內存預熱
- 設計中間表
- 減少關聯查詢,創建合理的冗餘字段
- 字段太多時,考慮垂直拆表
- 將字段內容很多的字段單獨拆解一個表