SlideShare a Scribd company logo
MySQL優化
- 從硬體、系統到參數的MySQL一站式優化
葉金榮
http://imysql.com,公眾號:MySQL中文網
2015.12.19 臺北
• 葉金榮
• CMUG副主席
• Oracle MySQL ACE
• 大陸最早的MySQL推廣者之一
• 2006年創辦首個MySQL專業技術中文網站 http://imysql.com
• 10餘年MySQL經驗,擅長MySQL性能優化、架構設計、故障排查
http://imysql.com 2
Agenda
•MySQL的特點
•硬體、系統優化
•MySQL配置優化
•SCHEMA設計優化
•SQL優化
•其他優化
http://imysql.com 3
MySQL的特點
l不要當做ORACLE、SQL Server或PostgreSQL來用
l不適宜的場景
l 存儲大文本、圖片、附件等大物件
l 複雜查詢,複雜運算,或全文檢索
l好的應用場景
l 快速提交的小事務
l 不太複雜的SQL請求
l 合適的表物件設計規則,單表壓力不要太大
http://imysql.com 4
MySQL的特點
• CPU資源利用特點
• 5.1之前,多核支持差
• 5.1,最高可用4個核
• 5.5,最高可用24個核
• 5.6,最高可用64個核
• 每個query對應一個執行緒,只能用到一個邏輯CPU
• 每個連接對應一個執行緒,只能用到一個邏輯CPU
• 建議
• CPU主頻越高越好,核數越多越好
• 多用新版本,少用舊版本
• 每次請求儘快結束,少用複雜SQL,事務及時提交/回滾
• 空閒連接主動快速斷開
http://imysql.com 5
MySQL的特點
• 記憶體資源利用特點
• 類似ORACLE SGA:innodb buffer pool、key buffer、query cache等
• 類似ORACLE PGA:sort buffer、join buffer、tmp table等
• MyISAM只能緩存索引
• InnoDB緩衝資料、索引
• 無索引排序會生成記憶體臨時表
• 建議
• 使用更多記憶體可減少物理IO,提高tps
• 關閉沒什麼卵用的query cache
• 所有實例分配的記憶體不超過實體記憶體的50%~70
• 檢查避免沒索引的情況,減少臨時表記憶體消耗
• KV等類型資料利用redis/memcached存取
http://imysql.com 6
MySQL的特點
• 磁片資源利用特點
• undo log的I/O特徵:順序寫,隨機讀;
• redo log、binlog的I/O特徵:順序寫,順序讀;
• 數據文件的I/O特徵:隨機寫,隨機讀;
• MyISAM是堆組織表(HOT),InnoDB是索引組織表(IOT)
• InnoDB相比MyISAM更消耗磁片空間
• 建議
• 加大記憶體
• 使用更高速的I/O設備
• data file放在高速I/O設備上,binlog、redo log放在機械盤上
• 採用xfs檔案系統
• kernel的io scheduler採用noop/deadline
http://imysql.com 7
性能瓶頸分析工具
• MySQL層面
• slow log
• show [global] status
• profiling
• show processlist
• show engine innodb status
• pt-ioprofile
參考:[MySQL FAQ]系列 — processlist中哪些狀態要引起關注
http://imysql.com 8
硬體優化
http://imysql.com 9
• BIOS配置優化
• CPU設置Maximum Performance
• 關閉C1E、C states
• 關閉NUMA
• I/O優化優化
• 使用PCIe-SSD等高速I/O設備
• RAID-10
• CACHE & BBU
• WB & FORCE WB
I/O子系統一般是最大瓶頸所在,提高IOPS能力的幾種
方法:
1. 換PCIe SSD(提高I/O效率,普通SAS盤2000以內的
iops,而新設備可達到數萬或者數十萬iops)
2. 減少物理I/O(合併多次讀寫為一次,或者前端加記
憶體CACHE;或者優化業務,消除I/O)
3. 加大記憶體,減少物理I/O;
4. 採用xfs檔案系統(相比ext3、ext4提高IOPS能力,高
io負載下表現更佳)
5. 調整raid級別為raid	10(相比raid1、raid5等提高IOPS
能力)
6. 調整寫cache策略為wb或force	wb(利用陣列卡cache,
提高iops)
7. io scheduler(優先使用deadline,如果是SSD,則使
用noop)
硬體優化
http://imysql.com 10
硬體優化
•關閉numa
注:5.6.27版本開始,新增innodb_numa_interleave選項可調整numa策略
http://imysql.com 11
硬體優化
http://imysql.com 12
系統優化
• io scheduler
• deadline/noop
http://imysql.com 13
系統優化
http://imysql.com 14
系統優化
• filesystems
• xfs
• ext4
http://imysql.com 15
系統優化
http://imysql.com 16
系統優化
• kernel
• vm.swappiness = 0~10,降低使用swap的幾率
• 調低參數值避免I/O負載高時候導致系統掛起
vm.dirty_background_ratio = 0~10
vm.dirty_ratio = 0~20
http://imysql.com 17
MySQL選項優化 – 記憶體相關
• 記憶體相關參數
http://imysql.com 18
MySQL選項優化 – InnoDB相關
http://imysql.com 19
• innodb_buffer_pool_size,最大不超過實體記憶體的50% ~ 70%
• innodb_data_file_path,ibdata1初始化時,至少1GB以上
• innodb_log_buffer_size,一般8-32MB足夠了
• innodb_log_file_size,5.5及以上可設置1~2GB,5.5以下建議256~512MB
• innodb_flush_log_at_trx_commit,0=>最快資料最不安全,1=>最慢最安全,2=>折中
• innodb_max_dirty_pages_pct,25%~50%為宜
• innodb_io_capacity,普通機械盤=>1000左右,SSD=>10000左右,PCIe SSD=>20000以上
MySQL選項優化 – 其他
• sync_binlog,0=>最快資料最不安全,系統自己決定刷新binlog的頻率;1=>最慢最安全,
每個event刷新一次;N=>每N個事務刷一次binlog
• long_query_time,建議設置小於0.1秒
• open_files_limit & innodb_open_files,建議65535
• max_connections,平均突發最大連接數的80%為宜,設置過大容易導致全部卡死
• thread_handling,頻繁突發連接時啟用(企業版PerconaMariaDB)
• query_cache_size & query_cache_type,關閉
http://imysql.com 20
SCHEMA設計優化
•默認採用InnoDB,不使用MyISAM
•INT AUTO_INC Primary Key for InnoDB
•INT unsigned for IPV4, 不使用CHAR(15)
•儘量不使用TEXT、BLOB
http://imysql.com 21
SCHEMA設計優化
• SQL查詢基於主鍵/唯一索時性能引優於普通索引
• 複合索引比普通索引更合適,有很多時候可以避免回表
• 基數(cardinality)小的列不建獨立索引
• 長字串欄位只創建部分長度索引
• ALTER TABLE t ADD INDEX(username(20))
• 用於檢索、排序的欄位,需要創建索引
• 多表JOIN的列類型一致,並創建合適的索引
http://imysql.com 22
MySQL索引限制
• 通過索引掃描的記錄數超過30%(大概值,非固定值),會變成全表掃描
• 第一個查詢條件列不是聯合索引的最左索引列無法使用該索引
• 記憶體表(HEAP 表)使用HASH索引時,使用範圍檢索或者ORDER BY
• 表關聯欄位類型不一樣(也包括長度不一樣),會發生隱式轉換
• 不支援聯合索引中多列不同排序規則
• 不支援函數索引(where date(xx) = ‘2015-12-19’)
• 不支援點陣圖索引(bitmap index)
• 不支持全模糊查詢(like ’%xxx%’)
• 注意類型隱式轉換,例如:char_col = int_val
http://imysql.com 23
SQL優化
http://imysql.com 24
• type
由左及右,最差到最佳
參考:[MySQL	FAQ]系列 — EXPLAIN結果中哪些資訊要引起關注
SQL優化
http://imysql.com 25
• Extra
通常是進行了全表/全索引掃描後再用WHERE
子句完成結果過濾
SQL優化
http://imysql.com 26
• Extra
沒有合適的索引用於排序,導致產生filesort
SQL優化
http://imysql.com 27
• Extra
沒有合適的索引用於JOIN以及排序,導
致需要用到臨時表及filesort
常見殺手級SQL
• SELECT * vs SELECT col1, col2
• ORDER BY RAND()
• WHERE func(key_col) = ?
• WHERE key_part2 =? AND key_part3 =?
• SELECT … WHERE key_col + ? = ?
參考:[MySQL優化案例]系列 — RAND()優化
http://imysql.com 28
常見殺手級SQL
SELECT a.x ...
FROM a
ORDER BY a.y LIMIT 11910298, 20;
採用子查詢進行優化 =>
SELECT a.x ...
FROM a
WHERE a.pkid > (SELECT pkid FROM a WHERE pkid >= 11910298 ORDER BY
a.y LIMIT 1) LIMIT 20;
參考:[MySQL優化案例]系列 — 分頁優化
http://imysql.com 29
慢日誌管理
http://imysql.com 30
• 利用pt-query-digest解析慢日誌
• 結合Box Anemometer/Query-Digest-UI集中展示慢日誌
slow	log	file	name:	slow_query.txt.vote-192.168.0.1-3306
pt-query-digest 解析日誌導入數據表中 :
>> dbname=`echo	 ${slowlog}|awk	-F	‘.txt.|.log.’	‘{print	$NF}’` //得到192.168.0.1-3306
>> pt-query-digest	…--filter=”…$event->{hostname}="${dbname}"”
myslow_review_history數據表中:
hostname_max:	192.168.0.1-3306
慢日誌管理
http://imysql.com 31
myslow_review_history數據表中:
hostname_max:	192.168.0.1-3306
解析成:
$conn[‘host’] = ‘192.168.0.1’;
$conn[‘port’] = 3306;
而後使用通用賬號密碼連接到目標DB
路在腳下 run run run
http://imysql.com 32

More Related Content

PDF
MySQL技术分享:一步到位实现mysql优化
PDF
高效Linux SA
PPTX
如何针对业务做DB优化
PDF
MySQL数据库设计、优化
PDF
MySQL设计、优化、运维
PDF
MySQL运维那些事
PDF
我们的MySQL
PDF
服务器基准测试-叶金荣@CYOU-20121130
MySQL技术分享:一步到位实现mysql优化
高效Linux SA
如何针对业务做DB优化
MySQL数据库设计、优化
MySQL设计、优化、运维
MySQL运维那些事
我们的MySQL
服务器基准测试-叶金荣@CYOU-20121130

What's hot (20)

PPTX
MySQL压力测试经验
PPTX
Mysql调优
PDF
Phx sql设计与实现
PPT
性能优化
PDF
Kvmopt osforce
PPTX
ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)
PDF
W3CTech美团react专场-Thinking in React
PPTX
Maven & mongo & sring
PDF
Nginx深度開發與客制化
PDF
Mvcc (oracle, innodb, postgres)
PPTX
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
PPTX
Cgroup lxc在17173 iaas应用池中应用
PDF
Hacking Nginx at Taobao
PDF
主库自动切换 V2.0
PDF
阿里CDN技术揭秘
PDF
一个 Mongodb command 的前世今生
PPT
Database.Cache&Buffer&Lock
PPTX
对MySQL的一些改进想法和实现
PPTX
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
PPTX
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
MySQL压力测试经验
Mysql调优
Phx sql设计与实现
性能优化
Kvmopt osforce
ASP.NET 開發人員不可不知的 IIS (IIS for ASP.NET Developers)
W3CTech美团react专场-Thinking in React
Maven & mongo & sring
Nginx深度開發與客制化
Mvcc (oracle, innodb, postgres)
Windows 與 Azure 的容器旅程 @ Ignite Mini 2016
Cgroup lxc在17173 iaas应用池中应用
Hacking Nginx at Taobao
主库自动切换 V2.0
阿里CDN技术揭秘
一个 Mongodb command 的前世今生
Database.Cache&Buffer&Lock
对MySQL的一些改进想法和实现
使用 C#/Razor 開發互動式 WebAssembly 網站 (Modern Web 2018)
ASP.NET 5 快速入門 (Getting Started ASP.NET 5)
Ad

Viewers also liked (6)

PDF
5 古雷my sql源碼與資料庫規範
PPT
Social networking presentation 5 20
PDF
My sql overview 2012 04-25 by scott chen - 30min - tw-1
PDF
7 吕智超-ssd101
PPT
Company Snapshot
PPT
Social networking present 5 20
5 古雷my sql源碼與資料庫規範
Social networking presentation 5 20
My sql overview 2012 04-25 by scott chen - 30min - tw-1
7 吕智超-ssd101
Company Snapshot
Social networking present 5 20
Ad

Similar to 4 葉金榮-my sql優化 - 20151219 (20)

PPSX
浅谈 My sql 性能调优
PPSX
MySQL应用优化实践
KEY
111030 gztechparty-小路-云时代的mysql
PDF
豆瓣网技术架构变迁
PPTX
My sql 5.6新特性深入剖析——innodb引擎
PPTX
tengine(nginx with lua ) develop at 2013
PDF
MySQL5.6新功能
PPT
Mysql 培训-优化篇
PDF
MySQL快速入门与提高
PDF
NoSQL误用和常见陷阱分析
PDF
Python小团队不妨知道的技术
PDF
2011 06-12-lamp-mysql
PDF
2011 06-12-lamp-mysql-顾春江
PPT
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
PDF
对MySQL应用的一些总结
PDF
Bypat博客出品-服务器运维集群方法总结2
PDF
MySQL自动切换设计与实现
PDF
新浪微博Feed服务架构
PPT
Basic oracle for developer&beginner
PDF
Inception自动审核系统设计与实现 王竹峰
浅谈 My sql 性能调优
MySQL应用优化实践
111030 gztechparty-小路-云时代的mysql
豆瓣网技术架构变迁
My sql 5.6新特性深入剖析——innodb引擎
tengine(nginx with lua ) develop at 2013
MySQL5.6新功能
Mysql 培训-优化篇
MySQL快速入门与提高
NoSQL误用和常见陷阱分析
Python小团队不妨知道的技术
2011 06-12-lamp-mysql
2011 06-12-lamp-mysql-顾春江
从林书豪到全明星 - 虎扑网技术架构如何化解流量高峰
对MySQL应用的一些总结
Bypat博客出品-服务器运维集群方法总结2
MySQL自动切换设计与实现
新浪微博Feed服务架构
Basic oracle for developer&beginner
Inception自动审核系统设计与实现 王竹峰

More from Ivan Tu (10)

PDF
8 彭立勳-double binlog方案
PDF
3 周彦偉-隨需而變 我所經歷的my sql架構變遷﹣周彥偉﹣acmug@2015.12台北
PDF
2 ivan ma-mysql複製的演進和應用-twn- v1
PDF
1 my sql20151219-kaji_ivan
PDF
My sql fabric webinar tw2
PDF
My sql resources_april2012_zht
PDF
My sql 56_roadmap_april2012_zht2
PDF
My sql cluster_taipei_event
PDF
My sql introduction for Bestcom
PDF
My S Q L Introduction for 1 day training
8 彭立勳-double binlog方案
3 周彦偉-隨需而變 我所經歷的my sql架構變遷﹣周彥偉﹣acmug@2015.12台北
2 ivan ma-mysql複製的演進和應用-twn- v1
1 my sql20151219-kaji_ivan
My sql fabric webinar tw2
My sql resources_april2012_zht
My sql 56_roadmap_april2012_zht2
My sql cluster_taipei_event
My sql introduction for Bestcom
My S Q L Introduction for 1 day training

4 葉金榮-my sql優化 - 20151219