如何查看linux mysql缓存存了多少linux的pages

前天有朋友问我,为啥我的系统没运行多少程序,显示的可用内存这么少?
其实与Win的内存管理不同,会尽量缓存内存以提高读写性能,通常叫做&。有时候你会发现没有什么程序在运行,但是使用top或free命令看到可用内存free项会很少,此时查看系统的
/proc/meminfo 文件,会发现有一项 Cached Memory:
输入cat /proc/meminfo查看:
MemFree: 5698808 kB
Buffers: 380904 kB
Cached: 9389356 kB
SwapCached: 212 kB
Active: 6569200 kB
Inactive: 3725364 kB
HighTotal: 0 kB
HighFree: 0 kB
LowFree: 5698808 kB
SwapTotal: 8273464 kB
SwapFree: 8273252 kB
Dirty: 980 kB
Writeback: 0 kB
AnonPages: 524108 kB
Mapped: 24568 kB
Slab: 381776 kB
PageTables: 7496 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit:
Committed_AS: 2143856 kB
VmallocTotal:
VmallocUsed: 267656 kB
VmallocChunk:
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB
free命令里各项内存指标说明:
total used free shared buffers cached
Mem: 6 0 9832
-/+ buffers/cache: 69512
其中第一行用全局角度描述系统使用的内存状况:
total——总物理内存
used——已使用内存,一般情况这个值会比较大,因为这个值包括了cache+应用程序使用的内存
free——完全未被使用的内存
shared——应用程序共享内存
buffers——缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)
cached——缓存,用于已打开的文件
total=used+free
used=buffers+cached (maybe add shared also)
第二行描述应用程序的内存使用:
前个值表示-buffers/cache——应用程序使用的内存大小,used减去缓存值
后个值表示+buffers/cache——所有可供应用程序使用的内存大小,free加上缓存值
-buffers/cache=used-buffers-cached
+buffers/cache=free+buffers+cached
第三行表示swap的使用:
used——已使用
free——未使用
什么是Cache Memory(缓存内存):
当你读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后,Cache Memory也不会自动释放。这就会导致你在Linux系统中程序频繁读写文件后,你会发现可用物理内存会很少。
其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有内存可用。如果你希望手动去释放Cache Memory也是有办法的。
如何释放Cache Memory(缓存内存):
用下面的命令可以释放Cache Memory:
To free pagecache:
echo 1 & /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 & /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 & /proc/sys/vm/drop_caches
注意,释放前最好sync一下,防止丢失数据。
总结:个人经验认为没必要手动释放,这种内存管理方式也是比win优胜的地方之一!因为Linux的内核内存管理机制,一般情况下不需要特意去释放已经使用的cache。这些cache起来的内容可以提高文件以及磁盘的读写速度。
本文已收录于以下专栏:
相关文章推荐
今天监控linux资源时,在输入top命令后,发现内存相关MEM和SWAP的buffer与Cache,顺便研究了一下。
什么是Cache?什么是Buffer?二者的区别是什么?
Buffer和C...
Page cache和buffer cache一直以来是两个比较容易混淆的概念,在网上也有很多人在争辩和猜想这两个cache到底有什么区别,讨论到最后也一直没有一个统一和正确的结论,在我工作的这一段时...
Linux系统Cache 管理是 Linux 内核中一个很重要并且较难理解的组成部分。本文详细介绍了 Linux 内核中文件 Cache 管理的各个方面,希望能够帮助到你。
操作系统和文件...
cpu性能探究-Linux Cache机制
在阅读文章前,您应该具备基本的存储器层次结构知识,至少要了解局部性原理。要详细了解cache基本原理,可以参考本书《深入理解计算机系统》中...
今天去面试,被问到linux下如何清除cache,一脸懵逼,因为是真的不知道,但记得用sync命令可以把内存中的数据写入硬盘,就这样说了,面试的技术好像不满意,下来之后查了查,原来还有/proc/sy...
转自:/4337.html
PS:前天有童鞋问我,为啥我的Linux系统没运行多少程序,显示的可用内存这么少?其实Linux与Win的内存管理不同,会尽量...
参考/developerworks/cn/linux/l-cn-slub/
[code=&java&]Linux SLUB 分配器详解
林 昊翔 (), Linux 内核爱好者
秦 君 (qinjun@), 软件工程师, IBM
简介: 多年以来,Linux 内核使用一种称为 SLAB 的内核对象缓冲区分配器。但是,随着系统规模的不断增大,SLAB 逐渐暴露出自身的诸多不足。SLUB 是 Linux 内核 2.6.22 版本中引入的一种新型分配器,它具有设计简单、代码精简、额外内存占用
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)MYSQL 调优和使用必读
06%-11%-14%17%18%-20%-31%-33%-50%-53%57%-57%-60%-64%-65%67%67%-71%-77%-80%-84%-90%-92%-97%
MYSQL 应该是最流行了 WEB 后端数据库。WEB 开发语言最近发展很快,PHP, Ruby, Python, Java&各有特点,虽然 NOSQL 最近越來越多的被提到,但是相信大部分架构师还是会选择 MYSQL 来做数据存储。
MYSQL 如此方便和稳定,以至于我们在开发 WEB 程序的时候很少想到它。即使想到优化也是程序级别的,比如,不要写过于消耗资源的 SQL 语句。但是除此之外,在整个系统上仍然有很多可以优化的地方。
1. 选择合适的存储引擎: InnoDB
除非你的数据表使用来做只读或者全文检索 (相信现在提到全文检索,没人会用 MYSQL 了),你应该默认选择&InnoDB 。
你自己在测试的时候可能会发现 MyISAM 比 InnoDB 速度快,这是因为:&MyISAM 只缓存索引,而 InnoDB 缓存数据和索引,MyISAM 不支持事务。但是 如果你使用&innodb_flush_log_at_trx_commit = 2&可以获得接近的读取性能 (相差百倍)&。
1.1 如何将现有的 MyISAM 数据库转换为 InnoDB:
mysql -u [USER_NAME] -p -e "SHOW TABLES IN [DATABASE_NAME];" | tail -n +2 | xargs -I '{}' echo "ALTER TABLE {} ENGINE=InnoDB;" & alter_table.sql
perl -p -i -e 's/(search_[a-z_]+ ENGINE=)InnoDB/\1MyISAM/g' alter_table.sql
mysql -u [USER_NAME] -p [DATABASE_NAME] & alter_table.sql
1.2 为每个表分别创建 InnoDB FILE:
innodb_file_per_table=1
这样可以保证 ibdata1 文件不会过大,失去控制。尤其是在执行&mysqlcheck -o &all-databases&的时候。
2. 保证从内存中读取数据,讲数据保存在内存中
2.1&足够大的 innodb_buffer_pool_size
推荐将数据完全保存在 innodb_buffer_pool_size ,即按存储量规划 innodb_buffer_pool_size 的容量。这样你可以完全从内存中读取数据,最大限度减少磁盘操作。
2.1.1 如何确定 innodb_buffer_pool_size 足够大,数据是从内存读取而不是硬盘?
mysql& SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_pages_%';
+----------------------------------+--------+
| Variable_name
+----------------------------------+--------+
| Innodb_buffer_pool_pages_data
| 129037 |
| Innodb_buffer_pool_pages_dirty
| Innodb_buffer_pool_pages_flushed | 9998
| Innodb_buffer_pool_pages_free
| Innodb_buffer_pool_pages_misc
| Innodb_buffer_pool_pages_total
| 131072 |
+----------------------------------+--------+
6 rows in set (0.00 sec)
发现 Innodb_buffer_pool_pages_free 为 0,则说明 buffer pool 已经被用光,需要增大&innodb_buffer_pool_size
InnoDB 的其他几个参数:
innodb_additional_mem_pool_size = 1/200 of buffer_pool
innodb_max_dirty_pages_pct 80%
或者用iostat -d -x -k 1 命令,查看硬盘的操作。
2.1.2 服务器上是否有足够内存用来规划
执行&echo 1 & /proc/sys/vm/drop_caches&清除操作系统的文件缓存,可以看到真正的内存使用量。
2.2 数据预热
默认情况,只有某条数据被读取一次,才会缓存在 innodb_buffer_pool。所以,数据库刚刚启动,需要进行数据预热,将磁盘上的所有数据缓存到内存中。数据预热可以提高读取速度。
对于 InnoDB 数据库,可以用以下方法,进行数据预热:
1. 将以下脚本保存为 MakeSelectQueriesToLoad.sql
SELECT DISTINCT
CONCAT('SELECT ',ndxcollist,' FROM ',db,'.',tb,
' ORDER BY ',ndxcollist,';') SelectQueryToLoadCache
engine,table_schema db,table_name tb,
index_name,GROUP_CONCAT(column_name ORDER BY seq_in_index) ndxcollist
B.engine,A.table_schema,A.table_name,
A.index_name,A.column_name,A.seq_in_index
information_schema.statistics A INNER JOIN
SELECT engine,table_schema,table_name
FROM information_schema.tables WHERE
engine='InnoDB'
) B USING (table_schema,table_name)
WHERE B.table_schema NOT IN ('information_schema','mysql')
ORDER BY table_schema,table_name,index_name,seq_in_index
GROUP BY table_schema,table_name,index_name
ORDER BY db,tb
mysql -uroot -AN & /root/MakeSelectQueriesToLoad.sql & /root/SelectQueriesToLoad.sql
3. 每次重启数据库,或者整库备份前需要预热的时候执行:
mysql -uroot & /root/SelectQueriesToLoad.sql & /dev/null 2&&1
2.3 不要让数据存到 SWAP 中
如果是专用 MYSQL 服务器,可以禁用 SWAP,如果是共享服务器,确定 innodb_buffer_pool_size 足够大。或者使用固定的内存空间做缓存,使用&memlock 指令。
3. 定期优化重建数据库
mysqlcheck -o &all-databases 会让 ibdata1 不断增大,真正的优化只有重建数据表结构:
CREATE TABLE mydb.mytablenew LIKE mydb.
INSERT INTO mydb.mytablenew SELECT * FROM mydb.
ALTER TABLE mydb.mytable RENAME mydb.
ALTER TABLE mydb.mytablenew RENAME mydb.
DROP TABLE mydb.
4. 减少磁盘写入操作
4.1 使用足够大的写入缓存&innodb_log_file_size
但是需要注意如果用 1G 的 innodb_log_file_size ,假如服务器当机,需要 10 分钟来恢复。
推荐 innodb_log_file_size 设置为 0.25 * innodb_buffer_pool_size
4.2 innodb_flush_log_at_trx_commit
这个选项和写磁盘操作密切相关:
innodb_flush_log_at_trx_commit = 1 则每次修改写入磁盘innodb_flush_log_at_trx_commit = 0/2 每秒写入磁盘
如果你的应用不涉及很高的安全性 (金融系统),或者基础架构足够安全,或者 事务都很小,都可以用&0 或者 2 来降低磁盘操作。
4.3 避免双写入缓冲
innodb_flush_method=O_DIRECT
5. 提高磁盘读写速度
RAID0&尤其是在使用 EC2 这种虚拟磁盘 (EBS) 的时候,使用软&RAID0&非常重要。
6. 充分使用索引
6.1 查看现有表结构和索引
SHOW CREATE TABLE db1.tb1\G
6.2 添加必要的索引
索引是提高查询速度的唯一方法,比如搜索引擎用的倒排索引是一样的原理。
索引的添加需要根据查询来确定,比如通过慢查询日志或者查询日志,或者通过 EXPLAIN 命令分析查询。
ADD UNIQUE INDEX
6.2.1 比如,优化用户验证表:
ALTER TABLE users ADD UNIQUE INDEX username_ndx (username);
ALTER TABLE users ADD UNIQUE INDEX username_password_ndx (username,password);
每次重启服务器进行数据预热
echo &select username,& & /var/lib/mysql/upcache.sql
添加启动脚本到 my.cnf
init-file=/var/lib/mysql/upcache.sql
6.2.2 使用自动加索引的框架或者自动拆分表结构的框架
比如,Rails 这样的框架,会自动添加索引,Drupal 这样的框架会自动拆分表结构。会在你开发的初期指明正确的方向。所以,经验不太丰富的人一开始就追求从 0 开始构建,实际是不好的做法。
7. 分析查询日志和慢查询日志
记录所有查询,这在用 ORM 系统或者生成查询语句的系统很有用。
log=/var/log/mysql.log
注意不要在生产环境用,否则会占满你的磁盘空间。
记录执行时间超过 1 秒的查询:
long_query_time=1
log-slow-queries=/var/log/mysql/log-slow-queries.log
8. 激进的方法,使用内存磁盘
现在基础设施的可靠性已经非常高了,比如 EC2 几乎不用担心服务器硬件当机。而且内存实在是便宜,很容易买到几十G内存的服务器,可以用内存磁盘,定期备份到磁盘。
将 MYSQL 目录迁移到 4G 的内存磁盘
mkdir -p /mnt/ramdisk
sudo mount -t tmpfs -o size=4000M tmpfs /mnt/ramdisk/
mv /var/lib/mysql /mnt/ramdisk/mysql
ln -s /tmp/ramdisk/mysql /var/lib/mysql
chown mysql:mysql mysql
9. 用 NOSQL 的方式使用 MYSQL
B-TREE 仍然是最高效的索引之一,所有 MYSQL 仍然不会过时。
用 HandlerSocket 跳过 MYSQL 的 SQL 解析层,MYSQL 就真正变成了 NOSQL。
单条查询最后增加 LIMIT 1,停止全表扫描。
将非&索引&数据分离,比如将大篇文章分离存储,不影响其他自动查询。
不用 MYSQL 内置的函数,因为内置函数不会建立查询缓存。
PHP 的建立连接速度非常快,所有可以不用连接池,否则可能会造成超过连接数。当然不用连接池 PHP 程序也可能将
连接数占满比如用了 @ignore_user_abort(TRUE);
使用 IP 而不是域名做数据库路径,避免 DNS 解析问题
你会发现优化后,数据库的性能提高几倍到几百倍。所以 MYSQL 基本还是可以适用大部分场景的应用的。优化现有系统的成本比系统重构或者迁移到 NOSQL 低很多。
上一篇:下一篇:
分享到微信
打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。
请将我们加入您的广告过滤器的白名单,请支持开源站点。谢谢您。MySQL系统调优及问题查找
性能优化相关状态参数 SHOW STATUS LIKE connections 连接数 uptime 启动时间 show_queries 慢查询次数 com_select 查询操作次数 com_insert 插入操作次数 com_update 更新操作次数 com_delete 删除操作次
性能优化相关状态参数
&&& SHOW STATUS LIKE 'value';
&&& connections&&&&& 连接数
&&& uptime&&&&&&&&&&&&& 启动时间
&&& show_queries&&& 慢查询次数
&&& com_select&&&&&&& 查询操作次数
&&& com_insert&&&&&&& 插入操作次数
&&& com_update&&&& 更新操作次数
&&& com_delete&&&&&& 删除操作次数
&&& 分析查询语句
&&& EXPLAIN/DESC SELECT;
&&& 禁用/启用索引
&&& ALTER TABLE table DISABLE/ENABLE KEYS;
&&& 禁用唯一索引
&&& SET UNIQUE_CHECK=0/1
&&& 分析、检查和优化表
&&& ANALYZE TABLE table1 [,table2 ...]
&&& CHECK TABLE& table1[,table2 ...]
&&& OPTIMIZE TABLE table1[,table2...]
分析SQL语句
&&& explain select count(*), max(id), min(id) from user\G
&&& 通过explain分析SQL语句,获知执行情况
Profiling的使用
&&& 打开profiling 参数
&&& &set profiling=1;
&&& 执行一些SQL语句后就可以查看query的pro 信息
&&& &show profiles cpu, blockio for query 6;
&&& #查看query 6所使用的CPU IO资源情况
索引中的限制
&&& 1、MyISAM引擎索引长度总和不能超过1000字节
&&& 2、BLOB和TEXT类型的列只能创建前缀索引
&&& 3、MySql不支持函数索引
&&& 4、使用不等于( != 或 &&) 的时候无法使用索引
&&& 5、过滤字段使用了函数后(如: abs(column)) 无法使用索引
&&& 6、Join语句中Join条件字段类型不一致时,无法使用索引
&&& 7、使用Like操作的时候如果条件以通配符开始 ( '%abc...')无法使用索引
&&& 8、使用非等值查询时,无法使用hash索引
查询效率测试工具 mysqlslap
&&& $ mysqlslap --create-schema=example --query=&select * from group_message where user_id=3 AND subject like 'weiurezs%' --iterations=10000
&&& #用于测试query的执行效率,给出平均、最大、最小执行时间。
FORCE INDEX(索引名称) 强制使用索引
&&& EXPLAIN select * from group_message
&&& FORCE INDEX(idx_group_message_author_subject)
&&& where user_id=3 AND author='3' AND subject like 'weiurazs%'\g
性能调优&&log设置
&&& Mysql的log项有:错误日志、更新日志、二进制日志、查询日志、慢查询日志
&&& Binlog
&&&&&&& &show variables like '%binlog%';
&&& 慢查询
&&&&&&& &show veriables like 'log_slow%';
&&&&&&& &show variables like 'long_query%';
&&&&&&& long_query_time最小值为1秒,如果需要进一步缩短慢查询的时间限制,可以使用Percona提供的microslow- path(//updated-msl-microslow-path-installation-walk-through/)
性能调优&&Query Cache
&&& 查看Query Cache系统变量
&&& &show variables like '%query_cache%';
&&& 了解Query Cache的使用情况
&&& &show status like 'Qcache%';
&&& cache命中率= Qcache_hits / (Qcache_hits + Qcache_inserts)
&&&&&&&&&&&&&&&&&&&&&&&&&&& Qcache_hits / (Qcache_hits + Com_select)& 应该更准确些
&&& 弊端: 1、Query语句的hash运算和查找资源增加CPU资源的消耗
&&&&&&& 2、Query Cache失效问题(当表的更新频繁时会造成非常高的失效率
&&&&&&&&&&&&&&& 3、Query Cache中缓存的Result Set, 而不是页面,可能造成内存的过度消耗,以及因内存不足造成过多的换入换出导致命中率的下降。
&&& 应对措施:
&&& 1、对那些经常更新的记录指定SQL_NO_CACHE的SQL Hint,强制MySQL不缓存。
&&&&&&& 2、对那些大部分时候都是静态的数据指定SQL_CACHE,使用CACHE。
&&&&&&& 3、对那些Result Set较大的的Query要么使用SQL_NO_CACHE,强制不使用CACHE,或者通过设置query_cache_limit参数来控制 query中cache的最大Result Set,系统默认为1M,大于此设定值的Result Set将不会Cache。
&&& Query Cache的限制
&&& 1、 5.1.17 之前的版本不能 Cache 帮定变量的 Query ,但是从 5.1.17 版本开始, Query Cache 已经开始支持帮定变量的 Query 了;
&&& 2、 所有子查询中的外部查询 SQL 不能被 Cache ;
&&& 3、在 Procedure , Function 以及 Trigger 中的 Query 不能被 Cache ;
&&& 4、包含其他很多每次执行可能得到不一样结果的函数的 Query 不能被 Cache 。
性能调优&&其他常用优化
&&& max_connections(最大连接数):一般设置为 500&800左右
&&& max_user_connections(每个用户允许的最大连接数):一般不做限制
&&& net_buffer_length(网络传输缓存):默认16KB基本够用
&&& thread_cache_size(Thread Cache池应该存放的连接线程数): 不应该小于应用系统对实际并发请求数,一般50-100之间。对短连接效果很好。
&&& 相关系统设置值及状态值
&&& &show variables like 'thread%';
&&& &show status like 'connections';
&&& &show status like '%thread%';
&&& Thread Cache 命中率:(应该保持在90%以上)
&&& Thread_Cache_hit = (Connections - Threads_created) / Connections * 100%;
MyISAM引擎优化
&&& MyISAM引擎适用场景:以读为主的非事务性数据系统,对数据的准确性要求不高时有优异的性能表现。
&&& 系统参数:
&&&&&&& key_buffer_size: 索引缓存大小
&&&&&&& key_buffer_block_size: 索引缓存中的Cache Block Size:
&&&&&&& key_cache_division_limit: LRU链表中的Hot Area和Warm Area的分界值(范围1-100),系统默认100,及只有Warm Cache。
&&&&&&& key_cache_aeg_threshold: 控制 Cache Block从Hot Area降到 Warm Area的限制
&&& 性能参数:
&&&&&&& key_block_not_flushed 已经更改但还未刷新到磁盘的Dirty Cache Block
&&&&&&& key_blocks_unused 目前未被使用的Cache Block数目
&&&&&&& key_read_requests& Cache Block被请求读取的总次数
&&&&&&& key_read, 在Cache Block中找不到需要读取的Key信息后到 .MYI 文件中读取的次数
&&&&&&& key_write_requests,& Cache Block被请求修改的总次数
&&&&&&& key_writes& 在Cache Block中找不到需要修改的Key信息后到 .MYI 文件中读入再修改的次数
&&& 参数合理性判断指标:
&&&&&&& Key_buffer_UsageRatio = ( 1- Key_blocks_used / (key_blocks_used +key_blocks_unused ) ) * 100%& &
&&&&&&&&&&& (应该在99%以上,如果该值过低,说明key_buffer_size设置过大,MySQL根本用不完)
&&&&&&& Key_buffer_read_HitRatio = ( 1- Key_reads / key_read_requests ) * 100%
&&&&&&&&&&& (应该在99%以上,如果值过低,说明key_buffer_size设置过小,需要增加;也可能是 key_cache_age_threshold 和 key_cache_division_limit 的设置不当,造成 Key Cache cache 失效太快 。一般来说,在实际应用场景中,很少有人调整 key_cache_age_threshold 和 key_cache_division_limit 这两个参数的值,大都是使用系统的默认值)
&&&&&&& Key_buffer_write_HitRatio = ( 1- Key_writes / key_Write_requests ) * 100%
&&& 多Cache系统
&&& MySQL 官方建议在比较繁忙的系统上一般可以设置三个 Key Cache :
&&& 一个 Hot Cache 使用 20% 的大小用来存放使用非常频繁且更新很少的表的索引;
&&& 一个 Cold Cache 使用 20% 的大小用来存放更新很频繁的表的索引;
&&& 一个 Warm Cache 使用剩下的 60% 空间,作为整个系统默认的 Key Cache ;
&&& Key Cache 的 Mutex 问题:目前MySQL在Active线程数量较高时非常容易出现 Cache Block 的锁问题
&&& Key Cache 预加载
&&& 在 MySQL 中,为了让系统刚启动之后不至于因为 Cache 中没有任何数据而出现短时间的负载过高或 者
&&& 是响应不够及时的问题。 MySQL 提供了 Key Cache 预加载功能,可以通过相关命令( LOAD INDEX INTO CACHE tb_name_list ... ),将指定表的所有索引都加载到内存中,而且还可以通过相关参数控制是否只 Load 根结点和枝节点还是将页节点也全部 Load 进来,主要是为 Key Cache 的容量考虑。
&&& 对于这种启动后立即加载的操作,可以利用 MySQL 的 init_file 参数来设置相关的命令,如下:
&&& mysql@sky:~$
/usr/local/mysql/etc/init.sql
&&& SET GLOBAL hot_cache.key_buffer_size=
&&& SET GLOBAL cold_cache.key_buffer_size=
&&& CACHE INDEX example._message in hot_cache
&&& CACHE INDEX example.event in cold_cache
&&& LOAD INDEX INTO CACHE example.top_message,example.event IGNORE LEAVES
&&&&&&& 这里我的 init file 中首先设置了两个 Key Cache ( hot cache 和 cold cache )各为 16M ,然后分别将 top_message 这个变动很少的表的索引 Cache 到 Hot Cache ,再将 event 这个变动非常频繁的表的索引Cache 到了 Cold Cache 中,最后再通过 LOAD INDEX INTO CACHE 命令预加载了 top_message,groups 这两个表所有索引的所有节点以及 event 和 user 这两个表索引的非叶子节点数据到 Key Cache 中,以提高系统启动之初的响应能力。
&&& 其他可以优化的地方&& &
&&&&&&& 1. 通过 OPTIMIZE 命令来整理 MyISAM 表的文件。这就像我们使用 Windows 操作系统会每过一段时间后都会做一次磁盘碎片整理,让系统中的文件尽量使用连续空间,提高文件的访问速度。 MyISAM 在通过 OPTIMIZE 优化整理的时候,主要也是将因为数据删除和更新造成的碎片空间清理,使整个文件连续在一起。一般来说,在每次做了较大的数据删除操作之后都需要做一次 OPTIMIZE 操作。而且每个季度都应该有一次 OPTIMIZE 的维护操作。
&&&&&&& 2. 设置 myisam_max_[extra]_sort_file_size 足够大,对 REPAIR TABLE 的效率可能会有较大改善。
&&&&&&& 3. 在执行 CREATE INDEX 或者 REPAIR TABLE 等需要大的排序操作的之前可以通过调整 session 级别的 myisam_sort_buffer_size 参数值来提高排序操作的效率。
&&&&&&& 4. 通过打开 delay_key_write 功能,减少 IO 同步的操作,提高写入性能。
&&&&&&& 5. 通过调整 bulk_insert_buffer_size 来提高 INSERT...SELECT... 这样的 bulk insert 操作的整体性能, LOAD DATA INFILE... 的性能也可以得到改善。当然,在设置此参数的时候,也不应该一味的追求很大,很多时候过渡追求极端反而会影响系统整体性能,毕竟系统性能是从整体来看的,而不能仅仅针对某一个或者某一类操作。
MySql MyISAM、INNODB类型表碎片优化
&&& 针对MyISAM表类型采用 OPTIMIZE TABLE table_name SQL语句清理碎片.
&&& InnoDB 使用的 Clustered Index,索引和数据绑定在一起,重排序是不现实的.所以不支持 MyISAM 式的 OPTIMIZE,而是绑定到了ALTER TABLE 命令上面.可以通过执行以下语句来整理碎片,提高索引速度:
&&& ALTER TABLE table_name ENGINE = I
这其实是一个NULL操作,表面上看什么也不做,实际上重新整理碎片了.当执行优化操作时,实际执行的是一个空的 ALTER 命令,但是这个命令也会起到优化的作用,它会重建整个表,删掉未使用的空白空间.
innodb 存储引擎优化
&&& Innodb 存储引擎和 MyISAM 存储引擎最大区别主要有四点,第一点是缓存机制,第二点是事务支持 ,第三点是锁定实现,最后一点就是数据存储方式的差异。在整体性能表现方面, Innodb 和 MyISAM 两个存储引擎在不同的场景下差异比较大,主要原因也正是因为上面这四个主要区别所造成的。
&&& Innodb_buffer_pool_size
&&& 假设是一台单独给 MySQL 使用的主机,物理内存总大小为 8G , MySQL 最大连接数为 500 ,同时还使用了 MyISAM 存储引擎,这时候我们的整体内存该如何分配呢?
&&& 内存分配为如下几大部分:
&&& 1、系统使用,假设预留 800M ;
&&& 2、线程独享,约 2GB = 500 * (1MB + 1MB + 1MB + 512KB + 512KB) ,组成大概如下 :
&&&&&&& sort_buffer_size : 1MB
&&&&&&& join_buffer_size : 1MB
&&&&&&& read_buffer_size : 1MB
&&&&&&& read_rnd_buffer_size : 512KB
&&&&&&& thread_statck : 512KB
&&& 3、MyISAM Key Cache ,假设大概为 1.5GB ;
&&& 4、Innodb Buffer Pool 最大可用量: 8GB - 800MB - 2GB - 1.5GB = 3.7GB
&&& 通过Buffer Pool 的实时状态信息来确定InnoDB的Buffer Pool的使用是否高效:
&&& &show status like 'Innodb_buffer_pool_%';
&&& Innodb_Buffer_pool_HitRatio = ( Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads ) / Innodb_buffer_pool_read_requests * 100%
&&& buffer pool 使用率 = Innodb_buffer_pool_pages_data / Innodb_buffer_pool_pages_total * 100%
&&& innodb_log_buffer_size 参数的使用&& &
&&& 顾名思义,这个参数就是用来设置 Innodb 的 Log Buffer 大小的,系统默认值为 1MB 。 Log Buffer的主要作用就是缓冲 Log 数据,提高写 Log 的 IO 性能。一般来说,如果你的系统不是写负载非常高且以大事务居多的话, 8MB 以内的大小就完全足够了。
&&& &show status like 'innodb_log%'; (查看innodb_log_buffer_size 设置是否合理)
&&& Innodb 存储引擎的物理存储结构:
&&&&&&& 最小单位: page(默认16KB)&&>extent(64连续的page)&&&segment(一个或多个extent)&&&tablespace(最大的物理结构单位,由多个segment组成)
&&& InnoDB 性能监控
&&&&&&& &show innodb status\G
&&&&&&& 持续获取状态信息的方法: create table innodb_monitor(a int) engine=
&&&&&&& 创建一个innodb_monitor空表后,InnoDB就会每隔15秒输出一次信息并记录到Error Log中,通过删除该表停止监控
&&&&&&& 除此之外,我们还可以通过相同的方式打开和关闭 innodb_tablespace_monitor, innodb_lock_monitor, innodb_table_monitor 这三种监控功能
MySQL 高可用性方案
&&& 1、MySQL Replication
&&& 2、MySQL Cluster
&&& 3、DRDB
转载请保留固定链接:
------分隔线----------------------------
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
一、集群复制状态检查 1、SHOW GLOBAL STATUS LIKE wsrep_%;+-------------...
1. 什么是表分区? 表分区,是指根据一定规则,将数据库中的一...
在你原来的网站服务商处利用phpmyadmin导出数据库为sql文件,这个...
MongoDB 2.4新引入了一套权限控制的机制,而旧的addUser的方法在...
内容提纲 MySQL的特点; 硬件、系统优化; MySQL 配置优化; SCH...
数据库在运行中突然断电,当服务器重启发现MySQL无法启动,查...}

我要回帖

更多关于 mysql 查看缓存命中率 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信