Chinaunix首页 | 论坛 | 博客
  • 博客访问: 909005
  • 博文数量: 91
  • 博客积分: 803
  • 博客等级: 准尉
  • 技术积分: 1051
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-24 13:42
文章分类

全部博文(91)

文章存档

2021年(1)

2020年(4)

2019年(4)

2018年(9)

2017年(11)

2016年(11)

2015年(6)

2014年(3)

2013年(28)

2012年(14)

分类: Mysql/postgreSQL

2017-05-16 14:52:36

如果仅使用MyISAM存储引擎,设置 key_buffer_size 为可用内存的20%,(再加上设置 innodb_buffer_pool_size = 0 );
如果仅使用InnoDB存储引擎,设置 innodb_buffer_pool_size 为可用内存的 70%, (设置 key_buffer_size = 10M,很小但不是0.)

什么是索引缓存(key_buffer)?

MyISAM引擎的缓存分为两部分.

索引块(Index blocks,每个1 KB,BTree结构、存放于 .MYI 文件) 缓存到 “key buffer” 中. 数据块缓存(Data block caching, 存放于 .MYD 文件中)交给操作负责, 所以确保留下了适量的空闲内存(给操作系统). 警告: 某些类型的操作系统总是报告说内存使用超过90%,虽然实际上还有很多的空闲内存.

SHOW GLOBAL STATUS LIKE 'Key%'; 执行后计算 Key_read_requests / Key_reads 的值, 如果比值较大(比如大于10), 那么 key_buffer 就足够了.

什么是缓存池(buffer_pool)?

InnoDB将所有缓存都放在 “buffer pool” 中, 缓存池的大小通过 innodb_buffer_pool_size 控制. 包含被打开表(open tables)中的 16KB一块的数据/索引块,此外还有一些附加开销.

MySQL 5.5(以及带插件的 5.1版本)允许您指定 块大小(block size)为 8 KB或4 KB. MySQL 5.5可以有多个缓冲池,因为每个缓存池有一个互斥锁, 所以设置多个池可以缓解一些互斥锁瓶颈.


更多InnoDB调优信息

另一种计算缓存大小的方法

将主缓存(main cache)设置为最小值; 如果同一台机器上有许多其他应用在跑, 并且/或者RAM内存小于2GB, 那么可以这样指定.

SHOW TABLE STATUS; 显示各个数据库中所有表的状态.

计算所有MyISAM表的 Index_length 值的总和. 让 key_buffer_size 小于等于这个和值. 计算所有 InnoDB表 Data_length + Index_length 值的总和. 设置 innodb_buffer_pool_size 为不超过总和值的110%. 如果有内存交换(swapping发生),需要将两个参数适量地按减小一些.

执行下面的SQL语句查看适合的参数值. (如果有很多表,可能耗时几分钟.)
SELECT  ENGINE,
        ROUND(SUM(data_length) /1024/1024, 1) AS "Data MB",
        ROUND(SUM(index_length)/1024/1024, 1) AS "Index MB",
        ROUND(SUM(data_length + index_length)/1024/1024, 1) AS "Total MB",
        COUNT(*) "Num Tables"
    FROM  INFORMATION_SCHEMA.TABLES
    WHERE  table_schema not in ("information_schema", "performance_schema")
    GROUP BY  ENGINE;



阅读(1225) | 评论(0) | 转发(0) |
0

上一篇:telnet测试邮件发送

下一篇:mysql参数优化

给主人留下些什么吧!~~