使用MyISAM键缓?/strong>
当MySQL执行某个利用了MyISAM数据表烦引的语句的时候,它会使用键缓存来保持索引倹{这U缓存减了盘I/OQ如果在~存中找C某个数据表需要的键|׃需要再ơ从盘中读取。不q的是,q种键缓存是有限的,q且在默认情况下Q它是所有的MyISAM数据表共享用的。如果在键缓存中没有扑ֈ键值ƈ且键~存是满的,争用会DQ必M弃缓存中的某些|为新值留出空间。如果下ơ需要那些已l被丢弃的|必dơ从盘上读取?br />
如果你很倚重MyISAM数据表,那么把它的键保存在内存中效果会很好,但是~存中的争用却会D相反的效果。从同一张表或不同的表读取数据都可能引v争用。你可以通过把键~存讄成以保存某个特定数据表的全部烦引,从而避免同一张数据表的争用,但是其它数据表的键仍焉要争用缓存空间?br />
MySQL 4.1以上版本个问题提供了一U解x案:它支持我们徏立多个键~存Qƈ允许我们把某张数据表的烦引指定ƈ且预先装入某个缓存。如果你的数据表使用得很频繁Qƈ且你有够的内存Q能够把它的索引载入~存中,那么q种操作是有用的。这U能力允怽同时避免同一张表和不同的表的争用Q徏立一个够大的缓存,让它保存数据表的全部索引Qƈ且指定该~存专门用于那张数据表。在键被载入~存之后Q不在需要磁盘I/O操作。同Ӟ键值永q不会被丢弃Q对数据表的键的查看操作可以在内存中完成?br />
下面的例子显CZ如何为sampdb数据库的member数据表徏立一个键~存Q该~存的名U是member_cacheQ大ؓ1MB。执行这些指令的时候,你必LQSUPERQ权限?br />
1.建立一个够容Ux据表索引的独立的~存Q?br />
mysql> SET GLOBAL member_cache.key_buffer_size = 1024*1024;
2.l数据表指定键缓存:
mysql> CACHE INDEX member IN member_cache;
+---------------+--------------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------------+--------------------+----------+----------+
| sampdb.member | assign_to_keycache | status | OK |
+---------------+--------------------+----------+----------+
3.把数据表索引预先d它的键缓存中Q?br />
mysql> LOAD INDEX INTO CACHE member;
+---------------+--------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------------+--------------+----------+----------+
| sampdb.member | preload_keys | status | OK |+---------------+--------------+----------+----------+
如果你希望把其它的数据表载入同一个缓存中Q或者ؓ其它的数据表建立键缓存,上面的操作就_了?br />
使用查询~存
MySQL服务器可以用查询缓存来提高那些重复执行的SELECT语句的处理速度。它Ҏ能的提高通常都是惊h的。查询缓存的工作方式如下所C:
· W一ơ执行某条SELECT语句的时候,服务器记住该查询的文本内容和它返回的l果?br />
· 服务器下一ơ碰到这个语句的时候,它不会再ơ执行该语句。作Z替,它直接从查询~存中的得到l果q把l果q回l客L?br />
· 查询~存是基于服务器所接收到的查询字符串的文本内容的。如果某些查询的文本完全相同Q那些它p些查询是相同的。如果某些查询的字符不同Q或者来自那些用了不同的字W集或通讯协议的客LQ那么它会认些查询是不同的。同P如果某些查询采用其它的功能相当、但是实际上没有指向相同的数据表Q例如引用了不同的数据库中的同名数据表)Q那么它们也是不同的?br />
· 当数据表被更C之后Q涉及到该数据表的Q何缓存查询都变成无效的,q且会被丢弃。这可以防止服务器返回过期的l果?br />
在默认情况下QMySQLҎ询缓存的支持是内建的。如果你不希望用这U缓存,q且想避免它所D的性能开销Q可以?-without-query-cache选项来运行配|脚本徏立服务器?br />
如果需要检某个服务器是否支持查询~存Q可以检查它的have_query_cachepȝ变量Q?br />
mysql> SHOW VARIABLES LIKE ’have_query_cache’;
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
对于那些支持查询~存的服务器来说Q缓存的操作是基于三个系l变量值的Q?br />
· query_cache_type军_查询~存的操作模式。下表显CZ可以使用的模式|
模式 |
含义 |
0 |
不要~存查询l果或检索缓存的l果? |
1 |
~存查询Q除非它们以SELECT SQL_NO_CACHE开头? |
2 |
Ҏ需要只~存那些以SELECT SQL_CACHE开头的查询? |
· query_cache_size军_分配l缓存的内存数量Q单位是字节?br />
· query_cache_limit讄被缓存的最大结果集大小Q比q个值大的查询结果不会被~存?br />
例如Qؓ了激zL询缓存ƈ为它分配16MB内存Q在配置文g中用下面的讄Q?br />
[mysqld]
query_cache_type=1
query_cache_size=16M
即query_cache_type的D|ؓӞquery_cache_size指定内存数量也会被分配。ؓ了避免浪费内存,只有在希望激zȝ存的时候才把大设|成大于零。同Ӟ即query_cache_type不ؓӞ查询~存的大设|ؓ零也会禁用缓存?br />
使用了查询缓存的独立客户端会在服务器的默认缓存模式状态下操作。客L可以使用下面的语句改变自q查询的默认缓存模式:
SET query_cache_type = val;
其中的val可以???Q它的意义与讄服务器启动时的query_cache_type变量的意义是相同的。在SET语句中,OFF、ON和DEMANDq些W号g0??对应?br />
客户端还可以通过在SELECT关键字后天添加调节符来控制个别查询的~存操作。如果缓存模式是ON或DEMANDQ那么SELECT SQL_CACHE语句会让查询l果被缓存。SELECT SQL_NO_CACHE语句会查询l果不被~存?br />
如果某些查询从经常改变的数据表中索信息,那么抑止对这些查询的~存操作是有用的。在q种情况下,~存未必有多大用处。假设你把Web服务器请求的日志存储在MySQL数据表中Q同时周期性地q行该数据表上的一l统计查询。对于很J忙的Web服务器来_会频J地出现新行插入该数据表的操作,因此该数据表的Q何缓存了的查询结果很快就变成无效的了。其含义是,管你周期性地提交l计查询Q但是查询缓存可能对q些查询没有什么h倹{在q种情况下,最好用SQL_NO_CACHE调节W告诉服务器不要~存q些查询的结果?
g问题
本文前面的部分中讨论的帮助你提高服务器性能的技术是没有考虑g配置的。你当然可以通过使用更好的硬件来让服务器q行地更快。但是ƈ非所有的与硬件相关的改变都有相同的h倹{当我们评估哪些g提高了性能的时候,最重要的原则与调整服务器参数的原则是相同的Q尽可能地把最多的信息攑֜最快的存储中,q让q些信息可能地保持在该存储中?br />
你可以改变几U硬仉|来提升服务器的性能Q?br />
在计机上安装更多的内存。这可以让你把服务器的缓存和~冲区大值配|成更大的,从而数据保存在内存中的时间更长,从磁盘上d信息的需要更?br />
重新配置pȝQ如果你拥有_的内存,能够在内存文件系l中执行全部的交换操作,那么删除所有的盘交换讑֤。否则,即你拥有够的用于交换操作的RAMQ某些系l仍然会跟磁盘进行交换操作?br />
增加更快的磁盘以改善I/O{待旉。在q种情况下,寻道旉是有代表性的主要的性能军_因素。横向移动磁头的速度比较慢,在磁头定位以后,从磁道上d信息块的速度相对较快。但是,如果需要选择是添加更多的内存q是更快的磁盘,那么最好选择d更多的内存。内存L比磁盘快Q而且d内存可以让你使用更大的缓存,从而减磁盘活动?br />
通过在物理设备上划分盘zd来获取ƈ行操作的优势。如果你可以在多个物理设备上划分L作和写操作,那么光度׃比从同一个设备读写要快一些。例如,如果你把数据库存储在一个设备上Q把日志存储在另一个设备上Q那么同时向两个讑֤写入信息的速度比数据库和日志׃n同一个设备的速度要快。请注意Q用同一个物理设备上的不同分Z是q行操作。这是没有好处的Q因为它们仍焉要争用相同的物理资源Q磁_?br />
在把数据重新部v到另外一个设备之前,你要保自己知道pȝ的负载状c如果在某个特定的物理设备上正在q行一些重要的业务Q那么把数据库放在该讑֤上有可能使性能更差。例如,如果你正在处理大量的Web业务Q同时把数据库移动到Web服务器文档目录所在的讑֤上,可能感觉不CQ何优ѝ?br />
使用RAID讑֤可以让你获取q行操作的优ѝ?br />
使用多处理器g。对于类似MySQL服务器的多线E应用程序来_多处理器g可以同时执行多个U程?/p>

]]>