标签:des style blog http 使用 strong
1.用户体验检测
2.Mysql状态检测
在Mysql命令行里面使用show status命令,得到当前mysql状态。
主要关注下列属性:
key_read_requests (索引读的请求数)(key_buffer_size设置影响)
key_reads(索引读响应数)
Key_blocks_used
Qcache_*
Open_tables(通过table_cache的设置影响)
Opened_tables
table_locks
3. 第三方工具检测
mysqlreporthttp://hackmysql.com/mysqlreport
mytophttp://jeremy.zawodny.com/mysql/mytop/
系统及Mysql的Log
系统命令: top, sar
Mysql的Log: slow_query.log
(三)硬件方面的优化
硬件方面,最容易成为Mysql瓶颈的部分是磁盘,其次是CPU和内存
磁盘方面
使用更快的磁盘,会对Mysql有很好的帮助
使用更多的硬盘,通过Raid,可以提高单块磁盘速度的问题
对于Raid方式,建议采用Raid 0+1 或者 Raid 1+0
CPU
毫无疑问,更高主频的CPU和更多的CPU数量可以给Mysql更
高的性能
内存
更高的内存,往往可以让Mysql中的更多的数据缓存在内存中,
但是,一个重要的因素是,需要有正确的Mysql的配置
网卡
使用千兆网卡及千兆网络
(四)操作系统方面的优化
1.不使用交换区。如果内存不足,增加更多的内存或配置你的系统使用较少内存
3.增加系统和MySQL服务器的打开文件数量
使用ulimit –n 65535
(五)应用级的优化
1.使用多服务器负载均衡(多台读和写,用复制技术进行数据同步)
3.使用数据缓存技术memcached
(六)Mysql配置的优化
1.key_buffer(=512):索引缓冲使用的内存数量
这对MyISAM表来说非常重要,设定在可用内存的25%-30%较好,通过检查状态值 Key_read_requests和 Key_reads,
可以知道key_buffer设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好 ,否则说明 key_buffer 设置有点偏小
2.innodb_buffer_pool_size(= 512):索引缓冲使用的内存数量
3.table_cache (=1024):数据表缓存区的尺寸
每当 MySQL 访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。
通过检查运行峰值时间的 Open_tables 和 Opened_tables 状态值,可以决定是否需要调整 table_cache 的值。
如果你发现 open_tables 的值等于 table_cache,并且发现 opened_tables 状态值在不断增长,那么你就需要增加 table_cache 参数值了,
也不能盲目地把 table_cache 参数设置成很大的值,如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。
4.sort_buffer_size (=256):指定排序用缓冲区的长度
该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。
所以,对于内存在4GB左右的服务器推荐设置为6-8M
5.join_buffer_size :关联查询用缓冲区的长度
4G内存以上,建议大于32M,该参数对应的分配内存也是每连接独享!
6.max_connections (=1024):可以复用的线程数量
允许同时连接MySQL服务器的客户数量 ,可以观察和估计系统在峰值最大的并发连接数来设置
7.thread_cache(=*):可以复用的线程数量
一般设置为CPU数×2
8.innodb_buffer_pool_size(= 512):innodb表缓存池大小
这对Innodb表来说非常重要。Innodb相比MyISAM表对缓冲更为敏感。MyISAM可以在默认的 key_buffer_size 设置下运行的可以,
然而Innodb在默认的innodb_buffer_pool_size 设置下却跟蜗牛似的。
由于Innodb把数据和索引都缓存起来,无需留给操作系统太多的内存,因此如果只需要用Innodb的话则可以设置它高达 70-80% 的可用内存。
一些应用于 key_buffer 的规则有 -- 如果你的数据量不大,并且不会暴增,那么无需把innodb_buffer_pool_size 设置的太大了.
9.innodb_flush_logs_at_trx_commit(=1) :事务提交后的日志刷新模式
是否为Innodb比MyISAM慢1000倍而头大?看来也许你忘了修改这个参数了。默认值是 1,这意味着每次提交的更新事务(或者每个事务之外的语句)都会刷新到磁盘中,
而这相当耗费资源,尤其是没有电池备用缓存时。很多应用程序,尤其是从 MyISAM转变过来的那些,把它的值设置为 2 就可以了,也就是不把日志刷新到磁盘上,
而只刷新到操作系统的缓存上。日志仍然会每秒刷新到磁盘中去,因此通常不会丢失每秒1-2次更新的消耗。如果设置为0就快很多了,不过也相对不安全了,
MySQL服务器崩溃时就会丢失一些事务。设置为2指挥丢失刷新到操作系统缓存的那部分事务.
(七)表的优化
1. 选择合适的数据引擎
MyISAM:适用于大量的读操作的表
InnoDB:适用于大量的写读作的表
2.选择合适的列类型
使用 SELECT * FROM TB_TEST PROCEDURE ANALYSE()可以对这个表的每一个字段进行分析,给出优化列类型建议
(八)建立索引原则
1.合理使用索引
一个Table在一次query中只能使用一个索引,使用EXPLAIN语句来检验优化程序的操作情况
使用analyze帮助优化程序对索引的使用效果做出更准确的预测
2.索引应该创建在搜索、排序、归组等操作所涉及的数据列上
3.尽量将索引建立在重复数据少的数据列中,唯一所以最好
例如:生日列,可以建立索引,但性别列不要建立索引
4.尽量对比较短的值进行索引
降低磁盘IO操作,索引缓冲区中可以容纳更多的键值,提高命中率
如果对一个长的字符串建立索引,可以指定一个前缀长度
5.合理使用多列索引
如果多个条件经常需要组合起来查询,则要使用多列索引(因为一个表一次查询只能使用一个索引,建立多个单列索引也只能使用一个)
6.充分利用最左前缀
也就是要合理安排多列索引中各列的顺序,将最常用的排在前面
7.不要建立过多的索引
只有经常应用于where,order by,group by中的字段需要建立索引.
8.利用慢查询日志查找出慢查询(log-slow-queries, long_query_time)
(九)充分利用索引
1.尽量比较数据类型相同的数据列
3.尽可能不对查询字段加函数,
如WHERE YEAR(date_col) < 1990改造成WHERE date_col < ’1990-01-01’
WHERE TO_DAYS(date_col) - TO_DAYS(CURDATE()) < cutoff 改造成WHERE date_col < DATE_ADD(CURDATE(), INTERVAL cutoff DAY)
(十)SQL语句的优化
1.创建合适的统计中间结果表,降低从大表查询数据的几率
2.尽量避免使用子查询,而改用连接的方式.例如:
SELECT a.id, (SELECT MAX(created) FROM posts WHERE author_id = a.id) AS latest_post
FROM authors a
可以改成:
SELECT a.id, MAX(p.created) AS latest_post
FROM authors AS a
INNER JOIN posts p ON (a.id = p.author_id)
GROUP BY a.id
select song_id from song_lib where singer_id in
(select singer_id from singer_lib
where first_char=‘A‘
) limit 2000改成:
select song_id from song_lib a
inner join singer_lib b on a.singer_id=b.singer_id and first_char=‘A‘ limit 2000
3.插入判断重复键时,使用ON DUPLICATE KEY UPDATE :
insert
into db_action.action_today(user_id,song_id,action_count) values(1,1,1)
ON DUPLICATE KEY UPDATE action_count=action_count+1;
4.避免使用游标
游标的运行效率极低,可以通过增加临时表,运用多表查询,多表更新等方式完成任务,不要使用游标.
(十一)使用Explain分析SQL语句使用索引的情况
当
你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联结和以什么次序联结的信息,借助于
EXPLAIN,可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT,你也能知道优化器是否以一个最佳次序联结表。为了
强制优化器对一个SELECT语句使用一个特定联结次序,增加一个STRAIGHT_JOIN子句。 。
EXPLAIN命令的一般语法是:EXPLAIN <SQL命令> 如:explain select * from a inner join b on a.id=b.id
EXPLAIN的分析结果参数详解:
1.table:这是表的名字。
2.type:连接操作的类型。
system:表中仅有一条记录(实际应用很少只有一条资料的表)
const:表最多有一个匹配行,用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时,
如:select * from song_lib where song_id=2(song_id为表的primary key)
eq_ref:对于每个来自于前面的表的行组合,从该表中用UNIQUE或PRIMARY KEY的索引读取一行,
如:select * from song_lib a inner join singer_lib b on a.singer_id=b.singer_id(b的type值为eq_ref)
ref:对于每个来自于前面的表的行组合,从该表中用非UNIQUE或PRIMARY KEY的索引读取一行
如:select * from song_lib a inner join singer_lib b on a.singer_name=b.singer_name和
select * from singer_lib b where singer_name=‘ccc’ (b的type值为ref,因为b.singer_name是普通索引)
ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行,
如:select * from singer_lib where singer_name=‘ccc’ or singer_name is null
index_merge:该联接类型表示使用了索引合并优化方法
Key: 它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。
key_len: 索引中被使用部分的长度,以字节计。
3.ref:ref列显示使用哪个列或常数与key一起从表中选择行
4.rows: MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。
5.Extra:这里可能出现许多不同的选项,其中大多数将对查询产生负面影响。一般有:
using where:表示使用了where条件
using filesort: 表示使用了文件排序,也就是使用了order by子句,并且没有用到order by 里字段的索引,从而需要
额外的排序开销,所以如果出现using filesort就表示排序的效率很低,需要进行优化,比如采用强制索引
的方法(force index)
===============================================
本文根据我自己的一点经验,讨论了Mysql服务器优化中两个非常重要的参数,分别是table_cache,key_buffer_size。 table_cache 指示表高速缓存的大小。当Mysql访问一个表时,如果在Mysql表缓冲区中还有空间,那么这个表就被打开并放入表缓冲区,这样做的好处是可以更快速地 访问表中的内容。一般来说,可以通过查看数据库运行峰值时间的状态值Open_tables和Opened_tables,用以判断是否需要增加 table_cache的值,即如果open_tables接近table_cache的时候,并且Opened_tables这个值在逐步增加,那就要 考虑增加这个值的大小了。 在mysql默认安装情况下,table_cache的值在2G内存以下的机器中的值默认时256到 512,如果机器有4G内存,则默认这个值是2048,但这决意味着机器内存越大,这个值应该越大,因为table_cache加大后,使得mysql对 SQL响应的速度更快了,不可避免的会产生更多的死锁(dead lock),这样反而使得数据库整个一套操作慢了下来,严重影响性能。所以平时维护中还是要根据库的实际情况去作出判断,找到最适合你维护的库的 table_cache值,有人说:“性能优化是一门艺术”,这话一点没错。大凡艺术品,大都是经过千锤百炼,精雕细琢而成。 这里还要说明一个问题,就是table_cache加大后碰到文件描述符不够用的问题,在mysql的配置文件中有这么一段提示 引用 “The number of open tables for all threads. Increasing this value increases the number of file descriptors that mysqld requires. Therefore you have to make sure to set the amount of open files allowed to at least 4096 in the variable "open-files-limit" in” section [mysqld_safe]” 说 的就是要注意这个问题,一想到这里,部分兄弟可能会用ulimit -n 作出调整,但是这个调整实际是不对的,换个终端后,这个值又会回到原始值,所以最好用sysctl或者修改/etc/sysctl.conf文件,同时还 要在配置文件中把open_files_limit这个参数增大,对于4G内存服务器,相信现在购买的服务器都差不多用4G的了,那这个这个 open_files_limit至少要增大到4096,如果没有什么特殊情况,设置成8192就可以了。 下面说说key_buffer_size这个参数,key_buffer_sizeO表示索引缓冲区的大小,严格说是它决定了数据库索引处理的速度,尤 其是索引读的速度。根据网络一些高手写的文章表示可以检查状态值Key_read_requests和Key_reads,即可知道 key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好,虽然我还没有找到理论的依据,但是,我在自己维护的几台实际运 行良好的库做过的测试后表明,这个比值接近1:20000,这从结果证明了他们说这话的正确性,我们不妨用之。 后记: 我前面说过,性能优化是一件细活,影响mysql性能的因素很多,本文中只是选取了其中我认为比较重要的两个参数,期待和网友一起探讨更多mysql性能优化的技术。 |
Mysql数据库优化技术之配置篇、索引篇 ( 必看 必看 转),布布扣,bubuko.com
Mysql数据库优化技术之配置篇、索引篇 ( 必看 必看 转)
标签:des style blog http 使用 strong
原文地址:http://www.cnblogs.com/huangtaozi/p/3818357.html