配色: 字号:
51CTO下载-mysql针对ISV和OEM实现产品的MYSQl5
2015-12-29 | 阅:  转:  |  分享 
  
Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

针对ISV和OEM实现产品的

MySQL5.6性能优化

杜修文Ivan.Tu@Oracle.Com

MySQLPrincipalSalesConsultant



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

议程

?基础平台:硬件,存储引擎和版本

?服务器的调优

?索引,查询和架构优化

?MySQLPerformanceSchema简介

?MySQLEnterpriseMonitor和QueryAnalyzer

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

设置基础

?效能调优课程–4天

本课程–45分钟

?精华的技术

?文本链结

?社区或企业版

MySQLEnterpriseMonitor除外



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

硬件的选择

?最多可达64个CPU内核(MySQL5.6以上的版本)

?内存

?Linux,Solaris,Windows

?硬盘

快速的硬盘(一万到一万五千转SAS)

RAID10,有电池支持的写快取(RAID控制器)

SSD(支持较高的吞吐)--MySQL5.6

?有冗余的网络和电源

?主从服务器都一样





Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

MySQL存储引擎

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

MySQL引擎

调优的决策

PluggableStorageEngines

Memory,IndexandStorageManagement





InnoDBMyISAMNDB

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

InnoDB

?事务性具完全符合ACID的要求

崩溃回复

多版并行控制(MVCC)

行级锁

?数据和索引可存于内存

?于5.6,InnoDB提供

稳定的读的效能

全文检索索引

改善表分区以加强导入速度



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

MyISAM

?MyISAM传统用例:

高速的读

非事务性或不需崩溃回复

表级锁

支持空间资讯(RTREE索引)



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

MySQL版本

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

lMySQL数据库架构

l效能,可靠,易用

l支援许多开发环境和语言

l高效能的多线程连线

处理

l全DML,DDL解析,

成本为基础的优化器

,查询和其结果集的

快取

l依表弹性指定储存引擎

,应应用系统的特性选择

储存引擎

l弹性的日志和实体存储的选择

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

MySQL版本–调优的决策

2008200920102012

MySQL5.0

可达4个内核

(SunMicro时代)

MySQL5.1

(InnoDBPlugin)

可达16个内核

(Oracle时代)

MySQL5.5

可达32个内核

MySQL5.6

可达48个内核以上

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

MySQL5.6:扩充性





用户可充份发挥新一代硬件和操作系统的效能

随著数据量和用户数增加时容量也增加

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

服务器的调优

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

调优的原则

?绝不先在生产环境调整

?先要有好的基准则试或可靠的工作负荷

?以一个好的基准线开始

?一次只调整一个事情

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

调优的原则-续

?监看结果

查询效能-queryanalyzer,slowquerylog,等.

吞吐量

单一查询时间

平均查询时间

CPU-top,vmstat

IO-iostat,top,vmstat,bonnie++

?记录和存结果



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

基准测试

?自行测试

–可用generalquerylog的产出

–JMeter,LoadRunner,VisualStudio

?mysqlslap

?supersmack

?mybench

?SysBench

?DBT2





Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

MySQL变数

?系统:

my.cnf/my.ini

某些是动态

某些是Session/全域

?STATUS:

Session/Global







SYSTEMVARIABLESSTATUSVARIABLES

datadiraborted_clients

general-logconnections

innodb_buffer_pool_sizecreated_tmp_disk_tables

max_connectionsthreads_created

portuptime

……

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

MySQL状态

?调整:系统变数

?监看:StatusVariables

?SHOW[GLOBAL|SESSION]STATUS

mysql>SHOWglobalstatuslike‘max_used_connections’

?“观查”boxidentifiesstatusvariables

状态变数WATCH

?max_used_connections

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

默认及配置的文档

?5.6

更新默认以配合现代系

自动调整量的变数

?5.6以前

–过时的配置样本文档

–例:my-innodb-heavy-4G.cnf

?建议:

考虑默认的5.6配置档

重新评估较旧的配置档内容

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

InnoDB的调优

?innodb_buffer_pool_size

可用内存的80%

mysql>showstatuslike''Innodb_buffer%'';



?innodb_log_file_size=~512MB5.5+

回复时间相对于效能

高速的写









WATCH

?Innodb_buffer_pool_reads

?Innodb_buffer_pool_read_requests

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

InnoDB的调优-下阶段

?innodb_flush_log_at_trx_commit(小心使用)

1在每次提交时同步到文档(fsync)

0/2可能损件一到二秒的数据

?innodb_flush_method=O_Direct

依据工作负荷和硬件

?innodb_buffer_pool_instances=8

只在5.5和5.6





依据您的工作负荷

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

MyISAM的调优

?快取

key_buffer_cache–可用内存的25%

SystemCache–可用内存的75%

?多个KeyBuffers

?预先载入KeyBuffers



?详情请参阅:





WATCH

?Key_read_requests

?Key_reads

?Key_buffer_size

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

通用的系統變數

?table_open_cache

5.6默认改为自400到-1(autosized)

?thread_cache_size

目标Threads_created~thread_cache_size







共通的趨勢WATCH

?%opened%

?%thread%

?Threads_created

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

?只用于当-

特定的查询和数据

很少Inserts/Updates/Deletes

?查询快取和结果集

0或OFF

1或ON快取所有的除非SELECTSQL_NO_CACHE

2或DEMAND不会快取除非SELECTSQL_CACHE

WATCH

?qcache_hits

?qcache_inserts

?qcache_not_cached

?qcache_total_blocks

?qcache_free_memory

通用服务器系统变数

查询快取

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

通用服务器系统变数

?tmp_table_size

在“inmemory”表中占用最多的量

Memoryvs.MyISAM(ondisk)

?如果临时表>

tmp_table_size或max_heap_table_size或

BLOB/TEXT

将MyISAM表至硬盘上





临时表–小心使用内存WATCH

?created_tmp_tables

?created_tmp_disk_tables



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

系统变数-小心使用

?soft_buffer_size

在groupby和orderby时用于排序

如果100M代表每个排序用100M的内存

在实验环境中混搭使用

2M->256Kin5.6

?建议

用默认或全然用测试

动态配置





依工作负荷况查询

更大不一定是更好

每个线程况JOIN用份内存

WATCH

?%opened%

?%thread%

?Threads_created



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

系统变数-小心使用-续

?join_buffer_size

在不使用索引的joins时

每个线程每个join最小分minimumallocatedperjoinperthread

?建议

用默认值

设为动态配置

基准测试

调整查询









依工作负荷况查询

更大不一定是更好

每个线程况JOIN用份内存

WATCH

?Select_full_join





Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

服务器调优的结论

一定要调的:

InnoDBBufferPool

KeyBufferCache(MyISAM)

在评估之后调整的:

innodb_log_file_size

innodb_flush_log_at_trx_commit

innodb_flush_method

innodb_buffer_pool_instances(5.5,5.6+)

table_open_cache

thread_cache_size

querycache(turnoff?)

tmp_table_size(persession)















要小心调整的:

sort_buffer_size

join_buffer_size

read_buffer_size(MyISAM)

read_rnd_buffer_size







Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

總結–5.6默認值

一定要調整的:

InnoDBBufferPool

KeyBufferCache(MyISAM)

評估再調整:

innodb_log_file_size5M->48M

innodb_flush_log_at_trx_commit

innodb_flush_method

innodb_buffer_pool_instances1->8

table_open_cache400->2000

thread_cache_size0->8+max_con/100

querycache

tmp_table_size















調整要小心的:

sort_buffer_size2MB->256K

join_buffer_size128K->256K

read_buffer_size(MyISAM)

read_rnd_buffer_size









需要調整的較少5.5->5.6

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

索引,查询和数据库架构

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

InnoDB和MyISAM索引的比对

?InnoDB是“Clustered”索引

主键和数据在一起

次键接在主键之后

数据自主键取出

?MyISAM

主键指向实际数据

次键指向实际数据

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

这意味著

?InnoDB

以主键查找和区域扫瞄很快

要指定一个主键

维持小的主键

Auto-Increment

CoveringIndex(查询所要的数据全在索引中)

?MyISAM

CoveringIndex



SELECTfname,lnameFROMcustomerWHERElname=‘Jones’;

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

MySQL中的索引

?加速取出,筛选和排序

?多字段

CREATEINDEXIDXONTAB1(col1,col2,col3);

?字首索引:

CHAR,VARCHAR,BINARY,andVARBINARY

CREATEINDEXPREONTAB1(COL1(10));

字首是以字节为单位,非字符

面对大字串时非常有用

对字段前面能选择时很有用



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

索引-筛选器

?SELECTFROMtableWHEREcity=‘MIAMI’

?如果没有ORDERBY数据以索引的顺序传回

?不会用索引的场景

行数太少

行数>表的10%

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

索引-Join

?索引加速joins

SELECTX.A,Y.BFROMX,Y

WHEREX.C=‘FL’andY.A=X.A;

?筛选器加在表X的字段C

表X需要一个加在字段C的索引当作筛选器

?表Y以其字段Ajoin到表X

表Y需要一个加在字段A的索引



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

索引-排序

?SELECTnameFROMtableORDERBYname

Yes



?SELECTnameFROMtableWHEREnameBETWEEN

Yes

‘AAA’and‘CCC’ORDERBYname;



?SELECTnameFROMtableWHEREcity=‘MIAMI’

No

ORDERBYname;



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

索引的最佳实务

?避免不必要的索引

mysql>SHOWCREATETABLEtablename

?避免重复

indexkey123(col1,col2,col3)

indexkey12(col1,col2)<-Notneeded!

indexkey1(col1)<--Notneeded!

?索引应限制在16bytes/chars以下

?面临大的字段或URL时

分隔字段或以MD5建立哈希键字段



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

数据架构

?越小越好

不要VARCHAR就默认成255

在临时表及快取会扩张为全尺寸

?用VARCHAR取代BLOB

用MEMORY引擎forGROUPBYandORDERBY

?PROCEDUREANALYSE()



?InnoDB主键

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

ProcedureAnalyse的例子

mysql>selectc.nameCityName,y.nameCountryNamefromCityc,Countryy

whereCountryCode=''TWN''andc.CountryCode=y.codeorderbyc.nameprocedureanalyse(5,1000)\G

1.row

Field_name:world.c.Name

Min_value:Changhwa

Max_value:Yungkang

Min_length:4

Max_length:17

Empties_or_zeros:0

Nulls:0

Avg_value_or_avg_length:7.1905

Std:NULL

Optimal_fieldtype:ENUM(''Changhwa'',''Chiayi'',''Chungho'',

''Chungli'',''Fengshan'',''Fengyuan'',''Hsichuh'',

''Hsinchu'',''Hsinchuang'',''Hsintien'',''Hualien'',''Ilan'',''Kangshan'',

''Kaohsiung'',''Keelung(Chilung)'',''Kueishan'',''Luchou'',

''Lungtan'',''Miaoli'',''Nantou'',''Panchiao'',''Pate'',''Pingchen'',

''Pingtung'',''Sanchung'',''Shulin'',''Taichung'',''Tainan'',

''Taipei'',''Taiping'',''Taitung'',''Tali'',''Taliao'',''Tanshui'',''Taoyuan'',

''Touliu'',''Tsaotun'',''Tucheng'',''Yangmei'',''Yuanlin'',''Yungho'',''Yungkang'')NOTNULL

2.row

Field_name:world.y.Name

Min_value:Taiwan

Max_value:Taiwan

Min_length:6

Max_length:6

Empties_or_zeros:0

Nulls:0

Avg_value_or_avg_length:6.0000

Std:NULL

Optimal_fieldtype:ENUM(''Taiwan'')NOTNULL



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

查询命令

?在MySQL中用IN子句是非常快的!

Select...WhereidxIN(1,23,345,456)

?字段名要放在条件的左边

Select...Wherefunc(idx)=20[indexignored]

Select..Whereidx=otherfunc(20)[mayuseindex]

?当对索引的字段用LIKE避免在开始处用%

Select...WhereidxLIKE(‘ABC%’)会用索引

Select...WhereidxLIKE(‘%XYZ’)一定用全表扫瞄

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

查询命令-续

?开启SlowQueryLog

用:log_queries_not_using_indexes



?用mysqldumpslow:



?





WATCH

?select_scan(fulltablescan)

?select_full_join(joinsw/oIndexes)

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

ExplainPlan可协助调优

?表取用的順序

?使用的索引

?自每個表取用的行數之估計值



EXPLAINSELECTFROM…

EXPLAINFORMAT=JSONSELECTFROM…







Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

ExplainPlan

?Cost:23941451=990,655

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

Explain–Workbench和JSON(M)Query>VisualExplain

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

加上索引

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

优化后?Theoriginalcostwas23941451=

990,655

?Thenewcostis111=1



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

Type字段

Access或JoinTypes

Positive

?eqref–uniquekey/primarytoreference

value

?const,system–turnpartofqueryinto

constant

?Null–tableorindexnotevenaccessed

?ref–matchsinglevalue,non-uniqueindex,

ref_or_null=possibleextrastep

?range–WHERE..BETWEEN,>

PossibleIssue

?ALLtablescan(dependsontablesize)

?INDEX(unless“usingIndexinEXTRA

column”



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

Extra字段

Positive

?UsingIndex

?Usingindexforgroupby





PossibleIssue

?Usingtemporary

?Usingfilesort

?UsingWhere

Good–UsingIndex



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

MySQLPerformance

Schema

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

PerformanceSchema-配置

?開啟/關閉PerformanceSchema

在my.cnf中加上:

[mysqld]

performance_schema=on

?開啟個別的偵測工具:

Withinmy.cnfadd:

[mysqld]

--performance_schema_instrument=''wait/synch/cond/%=counted’

off/false/0=Disabled

on/true/1=Enabled&Timed

counted=Enabled&Counted,ratherthanTimed



http://dev.mysql.com/doc/refman/5.6/en/performance-schema.html



Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

最常见的查询命令

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

最近10个命令

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

依FileI/O排序的文档

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

用到临时表的命令

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

MySQLEnterpriseMonitor

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

全局的调优顾问

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

自动化的规则

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

特别的调优建议

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

自图关联到查询命令

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

查询分析器

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

Repository

Enterprise

Dashboard

ServiceManager

Agent

EnterpriseMonitor的架构

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

结论

基础平台:硬件,存储引擎和版本

服务器的调优

索引,查询和架构优化

MySQLPerformanceSchema简介

MySQLEnterpriseMonitor和QueryAnalyzer

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

资源

?MySQL培训课程–MySQLPerformanceTuning



?效能调优的网路研讨会



?MySQL效能论坛



?下载MySQL5.6



?试用MySQLEnterpriseMonitor:





Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

Copyright?2013,Oracleand/oritsaffiliates.Allrightsreserved.编号

献花(0)
+1
(本文系peijs520131...首藏)