首页 详解mysql数据库优化方法

详解mysql数据库优化方法

举报
开通vip

详解mysql数据库优化方法详解mysql数据库优化方法 详解mysql数据库优化方法2010-12-18 15:08用analyze进行处理,定 期进行处理 ANALYZE[LOCAL|NO_WRITE_TO_BINLOG]TABLE tb1_name[,tbl_name]. 对表进行定义分析analyze table table_name CHECK TABLE tb1_name[,tbl_name].[option].option={QUICK|FAST|MEDIUM|EXTENDED|CHANG ED} 定期对表进行优化 O...

详解mysql数据库优化方法
详解mysql数据库优化方法 详解mysql数据库优化方法2010-12-18 15:08用analyze进行处理,定 期进行处理 ANALYZE[LOCAL|NO_WRITE_TO_BINLOG]TABLE tb1_name[,tbl_name]. 对表进行定义 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 analyze table table_name CHECK TABLE tb1_name[,tbl_name].[option].option={QUICK|FAST|MEDIUM|EXTENDED|CHANG ED} 定期对表进行优化 OPTIMIZE[LOCAL|NO_WRITE_TO_BINLOG]TABLE tb1_name[,tbl_name]. 则应使用OPTIMIZE TABLE命令来进行表优化。这个命令可以将表中的空间 碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费,但OPTIMIZE TABLE命令只对MyISAM、BDB和InnoDB表起作用。 例如:optimize table table_name 下面是mysql教程服务器优化配置的方法 (1)、back_log: 要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非 常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且 启动一个新线程。 back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求 可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个 队列大小上有它自己的限制。试图设定back_log高于你的操作系统的限制将是 无效的。 当你观察你的主机进程列表,发现大量264084|unauthenticated user|xxx.xxx.xxx.xxx|NULL|Connect|NULL|login|NULL的待连接进程时,就要加大back_log的值了。默认数值是50,我把它改为500。 (2)、interactive_timeout: 服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对mysql_real_connect()使用CLIENT_INTERACTIVE选项的客户。默认 。 数值是28800,我把它改为7200 (3)、key_buffer_size: 索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8M),我的MySQL主机有2GB内存,所以我把它改为 402649088(400MB)。 (4)、max_connections: 允许的同时客户的数量。增加该值增加mysqld要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到Too many connections错误。默认数值是100,我把它改为1024。 (5)、record_buffer: 每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是131072(128K),我把它改为16773120(16M) (6)、sort_buffer: 每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M),我把它改为16777208(16M)。 (7)、table_cache: 为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64,我把它改为512。 (、thread_cache_size: 可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性能可以这个变量值。通过比较Connections和Threads_created状态 。 的变量,可以看到这个变量的作用。我把它设置为80 (10)、wait_timeout: 服务器在关闭它之前在一个连接上等待行动的秒数。默认数值是28800,我把它改为7200。 注:参数的调整可以通过修改/etc/my.cnf文件并重启MySQL实现。这是一个比较谨慎的工作,上面的结果也仅仅是我的一些看法,你可以根据你自己主机的硬件情况(特别是内存大小)进一步修改。 在Apache,PHP,MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分。对于Discuz~论坛程序也是如此,MySQL的设置是否合理优化,直接影响到论坛的速度和承载量~同时,MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知识,同时还需要长时间的观察统计并且根据经验进行判断,然后设置合理的参数。下面我们了解一下MySQL优化的一些基础,MySQL的优化我分为两个部分,一是服务器物理硬件的优化;二是MySQL自身(my.cnf)的优化。 (1)服务器硬件对MySQL性能的影响 a)磁盘寻道能力(磁盘I/O),以目前高转速SCSI硬盘(7200转/秒)为例,这种硬盘理论上每秒寻道7200次,这是物理特性决定的,没有办法改变。MySQL每秒钟都在进行大量、复杂的查询操作,对磁盘的读写量可想而知。所以,通常认为磁盘I/O是制约MySQL性能的最大因素之一,对于日均访问量在100万PV以上的Discuz~论坛,由于磁盘I/O的制约,MySQL的性能会非常低下~解 决这一制约因素可以考虑以下几种解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 :使用RAID-0+1磁盘阵列,注意不要尝试使用RAID-5,MySQL在RAID-5磁盘阵列上的效率不会像你期待的那样快;抛弃传统的硬盘,使用速度更快的闪存式存储设备。经过Discuz~公司技术工 -10倍左右。 程的测试,使用闪存式存储设备可比传统硬盘速度高出6 b)CPU对于MySQL应用,推荐使用S.M.P.架构的多路对称CPU,例如:可以使用两颗Intel Xeon 3.6GHz的CPU。 c)物理内存对于一台使用MySQL的Database Server来说,服务器内存建议不要小于2GB,推荐使用4GB以上的物理内存。 (2)MySQL自身因素当解决了上述服务器硬件制约因素后,让我们看看MySQL自身的优化是如何操作的。对MySQL自身的优化主要是对其配置文件my.cnf中的各项参数进行优化调整。下面我们介绍一些对性能影响较大的参数。由于my.cnf文件的优化设置是与服务器硬件配置息息相关的,因而我们指定一个假想的服务器硬件环境: CPU:2颗Intel Xeon 2.4GHz内存:4GB DDR硬盘:SCSI 73GB 下面,我们根据以上硬件配置结合一份已经优化好的my.cnf进行说明: #vi/etc/my.cnf以下只列出my.cnf文件中[mysqld]段落中的内容,其他段落内容对MySQL运行性能影响甚微,因而姑且忽略。 [mysqld] port=3306 serverid=1 socket=/tmp/mysql.sock skip-locking #避免MySQL的外部锁定,减少出错几率增强稳定性。 skip-name-resolve禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求~ back_log=384指定MySQL可能的连接数量。当MySQL主线程在很短的时间内接收到非常多的连接请求,该参数生效,主线程花费很短的时间检查连接并且启动一个新线程。 back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。如果系统在一个短时间内有很多连接,则需要增大该参数的值,该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自己的限制。试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。 key_buffer_size=256M #key_buffer_size指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。对于内存在4GB左右的服务器该参数可设置为256M或384M。注意:该参数值设置的过大反而会是服务器整体效率降低~ max_allowed_packet=4M thread_stack=256K table_cache=128K sort_buffer_size=6M查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占~如果有100个连接,那么实际分配的总共排序缓冲区大小为100×6=600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。 read_buffer_size=4M读查询操作所能使用的缓冲区大小。和 sort_buffer_size一样,该参数对应的分配内存也是每连接独享~ join_buffer_size=8M联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享~ myisam_sort_buffer_size=64M table_cache=512 thread_cache_size=64 query_cache_size=64M指定MySQL查询缓冲区的大小。可以通过在MySQL控制台执行以下命令观察: #SHOW VARIABLES LIKE'%query_cache%'; #SHOW STATUS LIKE'Qcache%'; #如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况;如果Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,如果该值较小反而会影响效率,那么可以考虑不用查询缓冲;Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多。 sql优化方法 ,EXPLAIN输出的结果格式改变了,使得它更适合例如UNION语句、子查询以及派生表的结构。更令人注意的是,它新增了2个字段:id和 。当你使用早于MySQL 4.1的版本就看不到这些字段了。 select_type EXPLAIN结果的每行记录显示了每个表的相关信息,每行记录都包含以下几个字段: id 本次SELECT的标识符。在查询中每个SELECT都有一个顺序的数值。 select_type SELECT的类型,可能会有以下几种: SIMPLE 简单的SELECT(没有使用UNION或子查询) PRIMARY 最外层的SELECT。 UNION 第二层,在SELECT之后使用了UNION。 DEPENDENT UNION UNION语句中的第二个SELECT,依赖于外部子查询 SUBQUERY 子查询中的第一个SELECT DEPENDENT SUBQUERY 子查询中的第一个SUBQUERY依赖于外部的子查询 DERIVED 派生表SELECT(FROM子句中的子查询) table 记录查询引用的表。 type 表连接类型。以下列出了各种不同类型的表连接,依次是从最好的到最差的: system 表只有一行记录(等于系统表)。这是const表连接类型的一个特例。 const 表中最多只有一行匹配的记录,它在查询一开始的时候就会被读取出来。由于只有一行记录,在余下的优化程序里该行记录的字段值可以被当作是一个恒定值。const表查询起来非常快,因为只要读取一次~const用于在和PRIMARY KEY或UNIQUE索引中有固定值比较的情形。下面的几个查询中,tbl_name就是const表了: SELECT*FROMtbl_nameWHEREprimary_key=1; SELECT*FROMtbl_name WHEREprimary_key_part1=1ANDprimary_key_part2=2; eq_ref 从该表中会有一行记录被读取出来以和从前一个表中读取出来的记录做联合。与const类型不同的是,这是最好的连接类型。它用在索引所有部分都用于做连接并且这个索引是一个PRIMARY KEY或UNIQUE类型。eq_ref可以用于 在进行"="做比较时检索字段。比较的值可以是固定值或者是表达式,表达式中可以使用表里的字段,它们在读表之前已经准备好了。以下的几个例子中,MySQL使用了eq_ref连接来处理ref_table: SELECT*FROMref_table,other_table WHEREref_table.key_column=other_table.column; SELECT*FROMref_table,other_table WHEREref_table.key_column_part1=other_table.column ANDref_table.key_column_part2=1; ref 该表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录作联合。ref用于连接程序使用键的最左前缀或者是该键不是PRIMARY KEY或UNIQUE索引(换句话说,就是连接程序无法根据键值只取得一条记录)的情况。当根据键值只查询到少数几条匹配的记录时,这就是一个不错的连接类型。ref还可以用于检索字段使用=操作符来比较的时候。以下的几个例子中,MySQL将使用ref来处理ref_table: SELECT*FROMref_tableWHEREkey_column=expr; SELECT*FROMref_table,other_table WHEREref_table.key_column=other_table.column; SELECT*FROMref_table,other_table WHEREref_table.key_column_part1=other_table.column ANDref_table.key_column_part2=1; ref_or_null 这种连接类型类似ref,不同的是MySQL会在检索的时候额外的搜索包含NULL值的记录。这种连接类型的优化是从MySQL 4.1.1开始的,它经常用于子查询。在以下的例子中,MySQL使用ref_or_null类型来处理ref_table: SELECT*FROMref_table WHEREkey_column=exprORkey_columnISNULL; index_merge 这种连接类型意味着使用了Index Merge优化方法。这种情况下,key字段包括了所有使用的索引,key_len包括了使用的键的最长部分。详情请看"7.2.5 How MySQL Optimizes OR Clauses"。 unique_subquery 这种类型用例如一下形式的IN子查询来替换ref: value IN(SELECT primary_key FROM single_table WHERE some_expr) unique_subquery只是用来完全替换子查询的索引查找函数效率更高了。 index_subquery 这种连接类型类似unique_subquery。它用子查询来代替IN,不过它用于在子查询中没有唯一索引的情况下,例如以下形式: value IN(SELECT key_column FROM single_table WHERE some_expr) range 只有在给定范围的记录才会被取出来,利用索引来取得一条记录。key字段表示使用了哪个索引。key_len字段包括了使用的键的最长部分。这种类型时ref字段值是NULL。range用于将某个字段和一个定植用以下任何操作符比较时=,,,=,,=,IS NULL,=,BETWEEN,或IN: tmp_table_size=256M max_connections=768指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提示,则需要增大该参数值。 max_connect_errors=10000000 wait_timeout=10指定一个请求的最大连接时间,对于4GB左右内存的服务器可以设置为5-10。 thread_concurrency=8该参数取值为服务器逻辑CPU数量×2,在本例中,服务器有2颗物理CPU,而每颗物理CPU又支持H.T超线程,所以实际取值为4×2=8 skip-networking开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库教程服务器则不要开启该选项~否则将无法正常连接
本文档为【详解mysql数据库优化方法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_477730
暂无简介~
格式:doc
大小:27KB
软件:Word
页数:0
分类:互联网
上传时间:2018-02-02
浏览量:6