分类: Mysql/postgreSQL
2017-05-16 14:52:36
什么是索引缓存(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;