Mysql 优化
2013-09-11 23:03
316 查看
数据库优化:(1)SQL语句优化(2)数据库设计优化(3)参数优化(4)硬件资源和文件系统
# mysqldumpslow -s c -t 20 host - slow.log
这台mysql服务器的最大连接数是151,然后查询一下该服务器响应的最大连接数: 如果最大响应连接数超过了最大连接数,则会出现1040的错误。最大响应连接数一般占最大连接数85%左右。修改方法:> 在my.cnf 中修改max_connections 参数,并重启数据库
每次创建临时表时,Created_tmp_tables 都会增加,如果是在磁盘上创建临时表,Created_tmp_disk_tables 也会增加。Created_tmp_files 表示mysql 服务创建的临时文件数,比较理想的配置是:
Created_tmp_disk_tables / Created_tmp_tables * 100% <=25% 查看MYSQL服务器对临时表的配置:
上图表示只有16MB以下的临时表才能全部放到内存中,超过的会用到磁盘临时表。5、打开表的情况 Open_tables 表示打开表的数量,Opened_tables表示打开过的表的数量,可以用以下命令查看:
如果Opened_tables 数量过大,说明配置中table_open_cache(mysql5.1.3之前叫做table_cache)的值可能太小,查询服务器table_open_cache值: 比较合适的值:Open_tables / Opened_tables * 100% >= 85%Open_tables / table_cache * 100% <=95%
如果发现Threads_created 的值过大,表明mysql服务器一直在创建线程,这是比较消耗资源的,可以适当增大配置文件中thread_cache_size 的值。查询thread_cache_size 配置: 7、查询缓存(query_cache) 查询缓存主要涉及2个参数,一个是query_cache_size 设置Query_cache 的大小,一个是query_cache_type 是设置使用查询缓存的类型,我们可以用下面的命令查看:
开启query_cache :mysql> set global query_cache_size=1024*50; 下面解释一下参数:Qcache_free_blocks //缓存中相邻内存块的个数,数目大说明可能有碎片。FLUSH QUERY CACHE 会对缓存中的碎片进行整理,从而得到一个空闲块。Qcache_free_memory //缓存中空闲的内存Qcache_hits //多少次命中Qcache_inserts //插入次数,每次插入一个查询就增加1Qcache_lowmem_prunes //多少条Query因为内存不足而被清除出Query CacheQcache_not_cached // 不适合进行缓存的查询数量,通常由于这些查询不是用select语句或者用了now()之类的函数Qcache_queries_in_cache //当前缓存的查询(和响应)数量Qcache_total_blocks //缓存中块的数量查询query_cache 的配置命令: 参数解释:query_cache_limit //超过此大小的查询将不会被缓存query_cache_min_res_unit //缓冲块的最小值query_cache_size //查询缓存大小query_cache_type //缓存类型,决定缓存什么样的查询query_cache_wlock_invalidate //表示当有其他客户端正在对MyISAM 表进行写操作时,度请求是要等到WRITE LOCK 释放资源后再查询是否允许直接从Query Cache中读取结果,默认为OFF(可以直接从query cache中取得结果)注意:query_cache_min_res_unit 默认为4KB,这个值设置大队大数据查询有好处,但如果你的查询都是小数据,则容易造成内存碎片和浪费。查询缓存碎片率=Qcache_free_blocks /Qcache_total_blocks * 100%如果超过20%,可以用FLUSH QUERY CACHE 整理缓存碎片,或者尝试减小query_cache_min_res_unit 的值。查询利用率 = (query_cache_size - Qcache_free_memory )/query_cache_size * 100% 如果利用率在25%以下,说明query_cache_size设置的过大,可以适当减小;如果利用率高于80%而且Qcache_lowmem_prunes >50 说明query_cache_size 可能有点小,或者碎片太多。
9、文件打开数 一般情况下open_files 大于 open_files_limit 值时,mysql数据库就会发生卡住的现象,导致Apache服务器打不开相应页面,这个问题大家在工作中应注意,我们可以用如下命令查看:
比较合适的设置是:open_files / open_files_limit * 100% <=75%10、Innodb_buffer_pool_size Innodb存储引擎的缓存机制和MyISAM的最大区别就在于,Innodb不仅仅缓存索引,同时还会缓存数据。此参数用来设置Innodb最主要的buffer的大小,也就是缓存用户表及索引数据的最主要缓存空间,对Innodb整体性能影响也最大。
====================SQL 语句优化SQL语句的种类:ddl(数据定义语言) [create alter drop]dml(数据操作语言)[insert delete update]dtl(数据事务语言)[commit rollback savepoint]dcl(数据控制语言)[grant revoke]selectshow status 命令该命令可以显示mysql数据库当前状态,我们主要关心的是"Com"开头的指令show status like 'Com%'; == show session status like 'Com%'; // 显示当前控制台的情况show global status like 'Com%'; // 显示数据库从启动到查询的次数重点注意:Com_select , Com_insert , Com_update , Com_delete 通过这几个参数,可以很容易的了解到当前数据库的应用是以插入更新为主还是查询操作为主,以及各类SQL大致的执行比例是多少。还有几个常见的参数:Connections : 试图连接mysql服务器的基本情况Uptime : 服务器工作的时间(单位:秒)Slow_queries : 慢查询次数(默认是10)大批量插入数据:对于MyISAMalter table table_name disable keys;loading data;alter table table_name enable keys;也就是,在导入数据之前先关闭索引,不然每插入一条记录,由于数据改变了,需要另外的开销来维护索引,这将导致索引频繁的修改,因此,速度会较慢。
上面的顺序也表现了这4个工作对性能影响力的大小
在1-n的表中,应当尽量将冗余放在1这边。
(3)硬件
常用的硬盘有SAR、FC、SSDSSD 固态硬盘,使用闪存,随机读写性能好SAR和FC 硬盘 ,这两种硬盘都有盘片,需要机械臂来读写,因此随机读写效率明显低于固态硬盘SSD
long_query_time = 2 //最长执行时间
# mysqldumpslow -s c -t 20 host - slow.log
-s, 是表示按照何种方式排序
c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序
ac、at、al、ar,表示相应的倒序
-t, 是top n的意思,即为返回前面多少条的数据
-g, 后边可以写一个正则匹配模式,大小写不敏感的;
这台mysql服务器的最大连接数是151,然后查询一下该服务器响应的最大连接数: 如果最大响应连接数超过了最大连接数,则会出现1040的错误。最大响应连接数一般占最大连接数85%左右。修改方法:> 在my.cnf 中修改max_connections 参数,并重启数据库
> set global max_connections=160;
3、key_buffer_size
key_buffer_size 是设置MyISAM表索引缓存空间的大小,此参数对MyISAM表性能影响最大。 可以看到这里分配了16MB内存给key_buffer_size 查看key_buffer_size 使用情况: key_read_requests : 一共有n个索引读取请求key_readds : 有n个请求在内存中没有找到,直接从硬盘上读取索引索引未命中缓存的概率:key_cache_miss_rate = key_reads / key_read_requests * 100%如果key_cache_miss_rate 在0.1%(即每1000个请求有一个直接读取硬盘)以下,就算很好。如果key_cache_miss_rate 在0.01%以下,说明key_buffer_size 分配得过多,可以适当减少。4、临时表
当执行语句时,关于已经被创造了的隐含临时表的数量,我们可以用如下命令查询其具体情况:每次创建临时表时,Created_tmp_tables 都会增加,如果是在磁盘上创建临时表,Created_tmp_disk_tables 也会增加。Created_tmp_files 表示mysql 服务创建的临时文件数,比较理想的配置是:
Created_tmp_disk_tables / Created_tmp_tables * 100% <=25% 查看MYSQL服务器对临时表的配置:
上图表示只有16MB以下的临时表才能全部放到内存中,超过的会用到磁盘临时表。5、打开表的情况 Open_tables 表示打开表的数量,Opened_tables表示打开过的表的数量,可以用以下命令查看:
如果Opened_tables 数量过大,说明配置中table_open_cache(mysql5.1.3之前叫做table_cache)的值可能太小,查询服务器table_open_cache值: 比较合适的值:Open_tables / Opened_tables * 100% >= 85%Open_tables / table_cache * 100% <=95%
6、进程使用情况
如果我们在mysql服务器的配置文件中设置了thread_cache_size ,当客户端断开的时候,服务器处理此客户请求的线程将会缓存起来以响应下一个请求而不是销毁(前提是缓存数未达到上限)Thread_created 表示创建过的线程数,我们可以用以下的命令查看:如果发现Threads_created 的值过大,表明mysql服务器一直在创建线程,这是比较消耗资源的,可以适当增大配置文件中thread_cache_size 的值。查询thread_cache_size 配置: 7、查询缓存(query_cache) 查询缓存主要涉及2个参数,一个是query_cache_size 设置Query_cache 的大小,一个是query_cache_type 是设置使用查询缓存的类型,我们可以用下面的命令查看:
开启query_cache :mysql> set global query_cache_size=1024*50; 下面解释一下参数:Qcache_free_blocks //缓存中相邻内存块的个数,数目大说明可能有碎片。FLUSH QUERY CACHE 会对缓存中的碎片进行整理,从而得到一个空闲块。Qcache_free_memory //缓存中空闲的内存Qcache_hits //多少次命中Qcache_inserts //插入次数,每次插入一个查询就增加1Qcache_lowmem_prunes //多少条Query因为内存不足而被清除出Query CacheQcache_not_cached // 不适合进行缓存的查询数量,通常由于这些查询不是用select语句或者用了now()之类的函数Qcache_queries_in_cache //当前缓存的查询(和响应)数量Qcache_total_blocks //缓存中块的数量查询query_cache 的配置命令: 参数解释:query_cache_limit //超过此大小的查询将不会被缓存query_cache_min_res_unit //缓冲块的最小值query_cache_size //查询缓存大小query_cache_type //缓存类型,决定缓存什么样的查询query_cache_wlock_invalidate //表示当有其他客户端正在对MyISAM 表进行写操作时,度请求是要等到WRITE LOCK 释放资源后再查询是否允许直接从Query Cache中读取结果,默认为OFF(可以直接从query cache中取得结果)注意:query_cache_min_res_unit 默认为4KB,这个值设置大队大数据查询有好处,但如果你的查询都是小数据,则容易造成内存碎片和浪费。查询缓存碎片率=Qcache_free_blocks /Qcache_total_blocks * 100%如果超过20%,可以用FLUSH QUERY CACHE 整理缓存碎片,或者尝试减小query_cache_min_res_unit 的值。查询利用率 = (query_cache_size - Qcache_free_memory )/query_cache_size * 100% 如果利用率在25%以下,说明query_cache_size设置的过大,可以适当减小;如果利用率高于80%而且Qcache_lowmem_prunes >50 说明query_cache_size 可能有点小,或者碎片太多。
8、排序使用情况
它表示系统中数据进行排序时所使用的Buffer,可以通过以下命令查询: Sort_merge_passes 包括如下步骤: mysql首先会尝试在内存中做排序,使用的内存大小由系统变量sort_buffer_size来决定,如果它不够大则所有记录都读到内存中,而mysql 则会把每次在内存中排序的结果存到临时文件中,等mysql找到所有记录之后,再把临时文件中的记录做一次排序。这次再排序就会增加sort_merge_passes。实际上,mysql会用另一个临时文件来存储再次排序的结果,所以我们通常会看到sort_merge_passes增加的数值是建临时文件数的2倍。因为用到了临时文件,所以速度可能会比较慢,增大sort_buffer_size会减少sort_merge_passes和创建临时文件的次数,但盲目的增大sort_buffer_size并不一定会提高速度。9、文件打开数 一般情况下open_files 大于 open_files_limit 值时,mysql数据库就会发生卡住的现象,导致Apache服务器打不开相应页面,这个问题大家在工作中应注意,我们可以用如下命令查看:
比较合适的设置是:open_files / open_files_limit * 100% <=75%10、Innodb_buffer_pool_size Innodb存储引擎的缓存机制和MyISAM的最大区别就在于,Innodb不仅仅缓存索引,同时还会缓存数据。此参数用来设置Innodb最主要的buffer的大小,也就是缓存用户表及索引数据的最主要缓存空间,对Innodb整体性能影响也最大。
====================SQL 语句优化SQL语句的种类:ddl(数据定义语言) [create alter drop]dml(数据操作语言)[insert delete update]dtl(数据事务语言)[commit rollback savepoint]dcl(数据控制语言)[grant revoke]selectshow status 命令该命令可以显示mysql数据库当前状态,我们主要关心的是"Com"开头的指令show status like 'Com%'; == show session status like 'Com%'; // 显示当前控制台的情况show global status like 'Com%'; // 显示数据库从启动到查询的次数重点注意:Com_select , Com_insert , Com_update , Com_delete 通过这几个参数,可以很容易的了解到当前数据库的应用是以插入更新为主还是查询操作为主,以及各类SQL大致的执行比例是多少。还有几个常见的参数:Connections : 试图连接mysql服务器的基本情况Uptime : 服务器工作的时间(单位:秒)Slow_queries : 慢查询次数(默认是10)大批量插入数据:对于MyISAMalter table table_name disable keys;loading data;alter table table_name enable keys;也就是,在导入数据之前先关闭索引,不然每插入一条记录,由于数据改变了,需要另外的开销来维护索引,这将导致索引频繁的修改,因此,速度会较慢。
对于InnoDB
1. 将要导入的数据安装主键排序2. set unique_check=0 关闭唯一性校验3. set autocommit=0 关闭自动提交MyISAM 和 InnoDB1. MyISAM 不支持外键,Innodb支持2. MyISAM 不支持事务,Innodb支持
3. 对数据信息的存储处理方式不同。
如果存储引擎是MyISAM 的,则创建一张表,对应三个文件*.MYI 、*.MYD. 、*.FRM如果存储引擎是InnoDB,则创建一张表,对应一个文件*.frm,数据放在ibdata1
mysql >optimize table table_name
对于InnoDB,则需要
1 使用mysqldump命令将InnoDB数据库导出2 停止MySQL3 删除所有InnoDB数据库文件和日志4 启动MySQL并自动重建InnoDB数据库文件和日志文件5 导入前面备份的数据库文件
常见的sql 优化手法
1. 优化group by 语句默认情况下,mysql对所有的group by col1,col2进行排序,这与在查询中指定order by col1,col2类似。如果查询中包括group by 但用户想要避免排序结果的消耗,则可以使用order by null 禁止排序。比如select * from dept group by dname order by null;2. 有些情况下,可以使用连接来代替子查询。因为使用join,mysql不需要在内存中创建临时表3. 如果想要在含有or的查询语句中利用索引,则or之间的每个条件列都必须用到索引,如果没有索引,则应该考虑增加索引4. 在精度要求高的应用中,尽量使用定点数decimal例如:create table sal1(t1 float(10,2));create table sal2(t1 decimal(10,2));相关文章推荐
- MYSQL优化
- MySQL优化之一:服务器硬件和操作系统
- MySQL my.cnf参数配置优化详解
- 优化MD5和IP在(MySQL)数据库中的存储
- MYSQL性能优化的最佳20+条经验
- 浅谈MySQL中优化sql语句查询常用的30种方法
- 21条最佳MySQL性能优化
- MySQL 优化(二)
- MySQL Server参数优化 - innodb_file_per_table(独立表空间)
- Mysql优化之创建高性能索引(三)
- 优化mysql性能的十个参数的详细介绍
- [MySQL优化]为MySQL数据文件ibdata1瘦身
- mysql性能优化方案
- Mysql分页优化
- Mysql Insert 性能优化
- MySQL 索引优化 btree hash rtree
- mysql性能优化-慢查询分析、优化索引和配置
- mysql开启远程连接的权限及性能优化详解
- mysql性能优化-慢查询分析、优化索引和配置
- mysql处理海量数据时的一些优化查询速度方法