mysql性能调优精简版
大家好,我是烤鴨:
?? ?這是根據官方文檔提煉出的mysql性能優化總結。
? ? 想看完整翻譯版的請看??https://blog.csdn.net/Angry_Mills/article/details/87720396
?
1. 成本優化
?? ?成本包含: IO 和 CPU 從硬盤讀取的花費
?? ?模型包含: 全表掃描(IO成本:表中的pages * IO阻塞讀取成本 ?CPU成本: 行 * 行計算成本) 和 范圍索引掃描(IO成本:范圍中的行 * IO阻塞讀取成本 IO成本:范圍中的行 * 行計算成本)
2. 利用工具監視sql
?? ?MySQL Enterprise Monitor (MEM), Query Analyzer
?? ?Performance schema 執行計劃
?? ??? ?events_statements_history,events_statements_history_long
?? ??? ??? ?大部分最近執行的statement
? ? ? ??events_statements_summary_by_digest
?? ??? ??? ?總結相似操作(相同的statement合并)
?? ??? ?file_summary_by_event_name
?? ??? ??? ?Interesting event: wait/io/file/innodb/innodb_data_file
?? ??? ?table_io_waits_summary_by_table
?? ??? ?table_io_waits_summary_by_index_usage
? ? ? ? ?統計存儲引擎的每個表和索引
? ?調試查詢計劃:
SELECT trace FROM information_schema.optimizer_trace INTO OUTFILE <filename> LINES TERMINATED BY ''; SET optimizer_trace="enabled=off";3.數據訪問和索引優化
?? ?使用索引/添加索引/復合索引/索引合并
?? ??? ?注意低選擇性的索引!(字段長度或者變量比較少,比如sex int 1)
?
4.連接優化
?? ?找到最好的連接順序
?? ??? ?使用 STRAIGHT_JOIN
?? ?優化連接順序
?? ??? ?對非索引列進行過濾
?? ??? ?部分表強制提前處理無需暗示
?? ??? ?將派生表合并到外部查詢中
?? ??? ?無臨時表
?
5.子查詢優化
?? ?IN 轉換為 EXISTS
?? ?例子:
? ? ?優勢:子查詢將計算更少的記錄
?? ? Semi-join 半連接
?? ? ?? ?將子查詢轉換為內連接,但需要一些方法去重
? ? ? ? ? ? ??匹配優先(等價于IN—>EXISTS的方式)
? ? ? ? ? ? ??懶掃描(索引掃描,跳過重復)
? ? ? ? ? ? ??實體化??MatLookup(像子查詢實體化),MatScan(實體化表在連接順序的第一位)
? ? ? ? ? ? ??去重(用唯一索引將半連接的行插入臨時表;重復列將會被拒絕。無論連接順序)
?? ??? ?優勢:有更多優化"連接順序"的選擇
?? ??? ?限制:如果子查詢包含union(并集)或者aggregation(聚合)不能使用半連接
?? ?子查詢實例化:
?? ??? ?執行一次子查詢并在臨時表中存結果,表有唯一索引可以快速查找并去重
?? ??? ?執行外部查詢并檢查臨時表中的匹配項
?? ?派生表:
? ? 例子:
? ? ? ? mysql 5.6 以前 : 單獨執行并將結果存儲在臨時表中(實現)
?? ??? ?mysql 5.7 處理類似于視圖的派生表:可以與外部查詢塊合并
?? ??? ?注意:用外部連接合并派生表,基于GROUP BY,DISTINCT,LIMIT或聚合函數的派生表將不會合并
?? ?外部查詢與派生表MERGE
?? ??? ?NO_MERGE: 可用于覆蓋默認行為??
? ? ? MERGE: 強制合并? ? ? ? ? ??
SELECT /*+ MERGE(dt) */ * FROM t1 JOIN (SELECT x, y FROM t2) dt ON t1.x = dt.x;? ? ?也可以使用MERGE / NO_MERGE暗示查看視圖??
SELECT /*+ NO_MERGE(v) */ * FROM t1 JOIN v ON t1.x = v.x;?
6.排序
?? ?通常的解決方案;"FileSort"
?? ??? ?在排序之前將查詢結果存儲在臨時表中
?? ??? ?如果數據量很大,可能需要在磁盤上使用中間存儲進行多次傳遞排序
?? ?優化
?? ??? ?利用索引按排序順序生成查詢結果
?? ??? ?對于"LIMIT n查詢,保留內存中n個頂級項的優先級隊列而不是文件排序。
?? ?執行計劃
?? ??? ?可從執行計劃中對每個語句進行排序
?? ?優化方式
?? ??? ?增加排序緩沖區 SET sort_buffer_size = 8*1024*1024;
?? ??? ?使用索引避免排序
?? ??? ?重新研究案例
?
7.影響的優化器
?? ?增加索引
?? ??? ?強制使用特定索引 使用索引,強制索引,忽略索引
?? ?強制特定的關聯順序
?? ??? ?STRAIGHT_JOIN?? ?
?? ?調整會話變量?
?? ?mysql 5.7 優化
?? ??? ?(BKA) 批量key訪問?? ?(BNL) 阻塞嵌套循環算法
?? ??? ?(Multi-Range Read ) 多范圍讀取 (表的索引)
?? ??? ?連接和子查詢(策略)
?? ??? ?命中索引的情況
?? ??? ?范圍優化(索引)?
?? ??? ?阻塞查詢
?? ?未來 mysql 8.0 語法可能的優化:
?? ??? ?啟用/禁用視圖和派生表的合并
?? ??? ?MERGE() NO_MERGE()?
?? ??? ?連接順序
?? ??? ?考慮添加的暗示:
?? ??? ??? ?強制/忽略index_merge替代方案
?? ??? ??? ?重新實現新語法中的索引暗示
?? ??? ??? ?暫時為一個查詢設置會話變量
?? ?mysql 5.7 重寫查詢插件
?? ??? ?無需更改應用程序即可重寫有問題的查詢
?? ??? ??? ?更新連接順序... 更多
?? ??? ??? ??? ?向表中添加重寫規則
?? ??? ? 可調成本常量(不建議使用)
總結
以上是生活随笔為你收集整理的mysql性能调优精简版的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 左右值
- 下一篇: 下载各种在线视频及字幕