MySQL查询优化讲座之管理员的优化措施
用于提高服务器的操作性能的其它一些策略还包括:
禁止不需要的存储引擎。服务器不会为禁止的引擎分配任何内存,因此我们可以利用这一点。如果从源文件建立MySQL,那么在配置的时候,大多数存储引擎就可以被排除在服务器之外。对于那些包含在服务器中的引擎来说,使用适当的启动选项可以在运行时禁止其中的大多数。 保持授权表许可的简单性。尽管服务器在内存中缓存了授权表内容,但是如果你在tables_priv或columns_priv表中有一些数据行的话,服务器就必须为每个查询语句检查表层次和列层次的权限。如果这些表是空的,那么服务器就能优化自己的权限检查过程,略过这些层次。
如果你从源文件建立MySQL,那么就把它配置为使用静态类库,而不要使用共享类库。使用共享类库的动态二进制文件节约磁盘空间,然而静态二进制文件速度更快。但是,如果你使用了用户自定义函数(UDF)机制,那么有些系统要求使用动态链接。在这类系统上,静态二进制文件不能工作。
使用MyISAM键缓存
当MySQL执行某个利用了MyISAM数据表索引的语句的时候,它会使用键缓存来保持索引值。这种缓存减少了磁盘I/O:如果在缓存中找到了某个数据表需要的键值,就不需要再次从磁盘中读取。不幸的是,这种键缓存是有限的,并且在默认情况下,它是所有的MyISAM数据表共享使用的。如果在键缓存中没有找到键值并且键缓存是满的,争用将会导致:必须丢弃缓存中的某些值,为新值留出空间。如果下次需要那些已经被丢弃的值,就必须再次从磁盘上读取。
如果你很倚重MyISAM数据表,那么把它的键保存在内存中效果会很好,但是缓存中的争用却会导致相反的效果。从同一张表或不同的表读取数据都可能引起争用。你可以通过把键缓存设置成足以保存某个特定数据表的全部索引,从而避免同一张数据表的争用,但是其它数据表的键仍然需要争用缓存空间。
MySQL 4.1以上版本为这个问题提供了一种解决方案:它支持我们建立多个键缓存,并允许我们把某张数据表的索引指定并且预先装入某个缓存。如果你的数据表使用得很频繁,并且你有足够的内存,能够把它的索引载入缓存中,那么这种操作就是有用的。这种能力允许你同时避免同一张表和不同的表的争用:建立一个足够大的缓存,让它保存数据表的全部索引,并且指定该缓存专门用于那张数据表。在键被载入缓存之后,不在需要磁盘I/O操作。同时,键值永远不会被丢弃,对数据表的键的查看操作可以在内存中完成。
下面的例子显示了如何为sampdb数据库的member数据表建立一个键缓存,该缓存的名称是member_cache,大小为1MB。执行这些指令的时候,你必须有超级(SUPER)权限。
1.建立一个足够容纳数据表索引的独立的缓存:
mysql> SET GLOBAL member_cache.key_buffer_size = 1024*1024;
2.给数据表指定键缓存:
mysql> CACHE INDEX member IN member_cache; +---------------+--------------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------+--------------------+----------+----------+ | sampdb.member | assign_to_keycache | status | OK | +---------------+--------------------+----------+----------+
3.把数据表索引预先读入它的键缓存中:
mysql> LOAD INDEX INTO CACHE member; +---------------+--------------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------+--------------+----------+----------+ | sampdb.member | preload_keys | status | OK |+---------------+--------------+----------+----------+
如果你希望把其它的数据表载入同一个缓存中,或者为其它的数据表建立键缓存,上面的操作就足够了。 |