B. (TLB =Translation Lookaside Buffer,旁路转换缓冲.) TLB是硬件实现的内存关联查找表; 将64位的虚拟地址转换到实际的物理地址.
因为TLB是一个小的,虚拟寻址的缓存,有时会发生 “misses”(未命中),那就会进入物理RAM来查找. 这是两次查找是很费时的操作,所以应该避免.
通常,内存被 “分页” 为 4 KB一页,TLB实际上将高位的(64 - 12)位映射到一个特定页面. 而低12位通过虚地址转换得到完整的地址.
例如,128 GB的RAM按 4 KB分页需要 32M(3200万个) page-table条目. 这太大了, 远远超过TLB的容量. 所以陷入了“Huge page”的骗局.
随着硬件与操作系统的支持,使部分RAM成为巨型页面成为可能 ,比如说4 MB(而不是4 KB). 这使得TLB条目剧减,对这部分RAM来说分页单元是4 MB. 因此,巨大的页面相当于是不分页的(non-pagable).
现在内存被分为 pagable 和 non pagable 两部分; 哪些部分 non pagable 是合理的 在MySQL中, innodb_buffer_pool 就是一个完美的使用者. 通过正确地配置这些,InnoDB能跑得更快一点:
启用 Huge pages通知操作系统分配适当的数量(和 buffer_pool 个数一致) 通知MySQL使用huge pages innodb memory usage vs swap 该帖包含有很多需要关注点以及如何设置的细节.
整体性能收益:几个百分点. Yawn.
MEMORY引擎(ENGINE=MEMORY)
这是一个不常用的存储引擎,算是MyISAM和InnoDB的替代品. 其数据不是持久的,所以其应用范围相当有限. 内存表的大小受限于 max_heap_table_size ,默认值是16 MB. 我提起它,以防你将此值修改得太大;这会偷偷地占用可用的RAM.
如何设置变量(VARIABLEs)
在文本文件my.cnf中(Windows上是my.ini),添加一行,例如
innodb_buffer_pool_size = 5G
即: 变量名,等号“=”,变量的值. 有些值允许缩写,如M代表 million(1048576),G代表billion.
要让服务器看到这些设置,必须将其放到配置文件的 “[mysqld]”节下.
对 my.cnf 或 my.ini的设置不会立即生效,需要你重启服务器.
大多数的设置可以通过 root 账号登陆后在线修改 (其他 SUPER权限账号也可以),例如:
SET @@global.key_buffer_size = 77000000;
注意:此处不允许设置 M 或 G 等单位.
查看全局变量的设置信息:
mysql> SHOW GLOBAL VARIABLES LIKE "key_buffer_size";
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| key_buffer_size | 76996608 |
+-----------------+----------+注意,这部分设置MySQL会向下取整,对齐到一定的数字.
你可能需要修改两个地方(执行SET 并修改my.cnf),以使修改立即生效,并且下次重启后依然是同样的值(不管是手动,还是其他原因重新启动)
Web服务器
像Apache这样的web服务器使用多线程来处理. 如果每个线程打开一个 MySQL连接,可能会超过允许的最大连接数. 确保将web服务器的 MaxClients (或类似参数) 设置为一个合理的值(如50以下).
工具
MySQLTuner
TUNING-PRIMER
上面是几个对内存设置建议的工具. 其中有一个误导性条目:
Maximum possible memory usage: 31.3G (266% of installed RAM)
可能使用的内存最大值为: 31.3G (可能是物理内存的 266%)
不要让它吓到你,这些工具使用的公式过于保守了. 他们假设所有 max_connections 都在使用并且处于活跃状态,并正在执行一些内存密集型的工作.
Total fragmented tables: 23
有碎片的tables: 23 个
这意味着 OPTIMIZE TABLE 可能会有作用. 我建议对表设置高百分比的 “free space”(见SHOW TABLE STATUS) 或者你知道对什么表做了大量的删除/更新操作. 不过,不必费心频繁地对table进行OPTIMIZE 优化整理. 一个月一次可能就够了.
文章修改记录
2010创建;2012年10月更新,2014年1月更新;
更深入的文章:
MySQL 5.6的调优
InnoDB性能优化的基本知识(终极版)
MySQL安装后的10项优化设置
通过 MySQL论坛::性能 联系作者 ——里克·詹姆斯
里克·詹姆斯的MySQL相关文档
提示,调试、howto、优化相关等等……
Rick's RoTs (Rules of Thumb -- lots of tips)
Memory Allocation (caching, etc)
Character Set and Collation problem solver
Converting from MyISAM to InnoDB -- includes differences between them
Big DELETEs - how to optimize
Compound INDEXes plus other insights into the mysteries of INDEXing
Partition Maintenance (DROP+REORG) for time series
Entity-Attribute-Value -- a common, poorly performing, design patter; plus an alternative
Find the nearest 10 pizza parlors (efficient searching on Latitude + Longitude)
Alter of a Huge table
Latest 10 news articles -- how to optimize the schema and code for such
Pagination, not with OFFSET, LIMIT
Data Warehouse techniques (esp., Summary Tables)
Techniques on efficiently finding a random row (On beyond ORDER BY RAND())
GUID/UUID Performance (type 1 only)
IP Range Table Performance
MySQL Limits
Galera Limitations (with Percona XtraDB Cluster / MariaDB)
Rollup Unique User Counts
Best of MySQL Forum