13.5.5.1. CACHE INDEX语法
13.5.5.2. FLUSH语法
13.5.5.3. KILL语法
13.5.5.4. LOAD INDEX INTO CACHE语法
13.5.5.5. RESET语法

13.5.5.1. CACHE INDEX语法

CACHE INDEX
  tbl_index_list [, tbl_index_list] ...
  IN key_cache_name
 
tbl_index_list:
  tbl_name [[INDEX|KEY] (index_name[, index_name] ...)]

CACHE INDEX语句把表索引分配给某个关键缓存。该语句只用于MyISAM表。

下列语句把索引从表t1, t2t3分配到名为hot_cache的关键缓存:

mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
+---------+--------------------+----------+----------+
| Table   | Op                 | Msg_type | Msg_text |
+---------+--------------------+----------+----------+
| test.t1 | assign_to_keycache | status   | OK       |
| test.t2 | assign_to_keycache | status   | OK       |
| test.t3 | assign_to_keycache | status   | OK       |
+---------+--------------------+----------+----------+

CACHE INDEX语法允许您指定,只有来自表的特定索引应被分配给缓存。但是,当前的实施会把所有的表索引分配给缓存,所以必须指定表名称,不能指定其它的。

被引用到CACHE INDEX语句中的关键缓存可以这样创建,即通过使用一个参数设置语句或在服务器参数设置中设置其大小。举例说明:

mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;

关键缓存参数可以被作为一个结构化系统变量的成分进行访问。请参见9.4.1节,“结构式系统变量”

在您可以把索引分配给一个关键缓存以前,缓存必须存在:

mysql> CACHE INDEX t1 IN non_existent_cache;
ERROR 1284 (HY000): Unknown key cache 'non_existent_cache'

默认情况下,表索引被分配给在服务器启动时被创建的主(默认)键缓存。当一个键高速缓冲被破坏时,所有被分配到此缓存中的索引会再次被分配给默认的 键高速缓冲。

索引的分配会对服务器产生全局性影响:如果一个客户端把一个索引分配给一个给定的缓存,则不论什么客户端发布查询,本缓存都被用于所有涉及索引的查询。

13.5.5.2. FLUSH语法

FLUSH [LOCAL | NO_WRITE_TO_BINLOG] flush_option [, flush_option] ...

如果您想要清除MySQL使用的部分内部缓存,您应该使用FLUSH语句。要执行FLUSH,您必须拥有RELOAD权限。

flush_option可以为以下的任何一个:

·         HOSTS

用于清空主机缓存表。如果有的主机更改了IP号或如果您得到了错误信息Host host_name is blocked,则您应该刷新主机表。当在连接到MySQL服务器时,如果对于一个给定的主机,接连出现错误“多于max_connect_errors”,此时,MySQL会假定出现了错误,并阻止主机后续的连接申请。刷新主机表允许主机尝试再次连接。请参见A.2.5节,“主机的host_name被屏蔽。您可以使用max_connect_errors=999999999启动mysqld,以避免此错误信息。

·         DES_KEY_FILE

用于在服务器启动时,从采用--des-key-file选项指定的文件重新载入DES关键字。

·         LOGS

用于关闭并重新打开所有的日志文件。如果您已经指定了一个更新日志文件或一个二进制日志文件,同时没有扩展,则相对于前一个文件,日志文件的扩展号增加1。如果您在文件名称中使用了一个扩展,则MySQL会关闭并重新打开日志文件。在Unix中,当相mysqld服务器发送一个SIGHUP信号时,也会如此(例外情况是部分Mac OS X 10.3版本。在这些版本中,mysqld忽略SIGHUPSIGQUIT)。

如果服务器使用--log-error选项,则FLUSH LOGS会导致错误日志被重命名(使用后缀-old),同时mysqld会创建一个新的空日志文件。如果没有给定--log-error选项,则不会进行重命名。

·         PRIVILEGES

用于从mysql数据库中的授权表重新载入权限。

·         QUERY CACHE

对查询缓存进行整理碎片,以更好得利用存储器。与RESET QUERY CACHE不同,本语句不会从缓存中取消任何查询。

·         STATUS

用于把多数状态变量重新设置为零。只在当调试查询时,您才应该使用此项。请参见1.7.1.3节,“如何通报缺陷和问题”

·         {TABLE | TABLES} [tbl_name [, tbl_name] ...]

当没有表被命名时,关闭所有打开的表,并迫使所有正在使用的表关闭。这也会刷新查询缓存。此项含有一个或多个表名称,只刷新给定的表。和RESET QUERY CACHE语句一样,FLUSH TABLES还会取消来自查询缓存的所有查询结果。

·         TABLES WITH READ LOCK

对于所有带读取锁定的数据库,关闭所有打开的表,并锁定所有的表,直到您执行UNLOCK TABLES为止。如果您拥有一个可以及时进行快照的文件系统,比如Veritas,则这是进行备份的非常方便的方法。

·         USER_RESOURCES

用于把所有每小时用户资源重新设置为零。这可以使已经达到了每小时连接、查询或更新限值的客户端立刻重新恢复活性。FLUSH USER_RESOURCES不适用于同时连接的最大限值。请参见13.5.1.3节,“GRANT和REVOKE语法”

FLUSH语句被写入二进制日志,除非使用了自选的NO_WRITE_TO_BINLOG关键字(或其别名LOCAL)。 注释:在任何情况下,FLUSH LOGS, FLUSH MASTER, FLUSH SLAVEFLUSH TABLES WITH READ LOCK都不会被记入日志,因为如果它们被复制到一个从属服务器上,会导致出现问题。

您也可以使用flush-hosts, flush-logs, flush-privileges, flush-statusflush-tables命令访问含有mysqladmin应用程序的语句。

注释:在MySQL 5.1.2-alpha中,不可能在已存储的函数或触发程序中发布FLUSH语句。不过,您可以在已存储的过程中使用FLUSH,只要它们不会从已存储的函数或触发程序中被调用。请参见I.1节,“对存储子程序和触发程序的限制”

要了解有关RESET语句与复制同时使用的信息,也可以见13.5.5.5节,“RESET语法”

13.5.5.3. KILL语法

KILL [CONNECTION | QUERY] thread_id

每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止一个线程。

KILL允许自选的CONNECTIONQUERY修改符:

·         KILL CONNECTION与不含修改符的KILL一样:它会终止与给定的thread_id有关的连接。

·         KILL QUERY会终止连接当前正在执行的语句,但是会保持连接的原状。

如果您拥有PROCESS权限,则您可以查看所有线程。如果您拥有SUPER权限,您可以终止所有线程和语句。否则,您只能查看和终止您自己的线程和语句。

您也可以使用mysqladmin processlistmysqladmin kill命令来检查和终止线程。

注释:您不能同时使用KILLEmbedded MySQL Server库,因为内植的服务器只运行主机应用程序的线程。它不能创建任何自身的连接线程。

当您进行一个KILL时,对线程设置一个特有的终止标记。在多数情况下,线程终止可能要花一些时间,这是因为终止标记只会在在特定的间隔被检查:

·         SELECT, ORDER BYGROUP BY循环中,在读取一组行后检查标记。如果设置了终止标记,则该语句被放弃。

·         ALTER TABLE过程中,在每组行从原来的表中被读取前,检查终止标记。如果设置了终止标记,则语句被放弃,临时表被删除。

·         UPDATEDELETE运行期间,在每个组读取之后以及每个已更行或已删除的行之后,检查终止标记。如果终止标记被设置,则该语句被放弃。注意,如果您正在使用事务,则变更不会被 回滚。

·         GET_LOCK()会放弃和返回NULL

·         INSERT DELAYED线程会快速地刷新(插入)它在存储器中的所有的行,然后终止。

·         如果线程在表锁定管理程序中(状态:锁定),则表锁定被快速地放弃。

·         如果在写入调用中,线程正在等待空闲的磁盘空间,则写入被放弃,并伴随"disk full"错误消息。

·         警告:对MyISAM表终止一个REPAIR TABLEOPTIMIZE TABLE操作会导致出现一个被损坏的没有用的表。对这样的表的任何读取或写入都会失败,直到您再次优化或修复它(不中断)。

13.5.5.4. LOAD INDEX INTO CACHE语法

LOAD INDEX INTO CACHE
  tbl_index_list [, tbl_index_list] ...
 
tbl_index_list:
  tbl_name
    [[INDEX|KEY] (index_name[, index_name] ...)]
    [IGNORE LEAVES]

LOAD INDEX INTO CACHE语句会把一个表索引预载入到某个关键缓存中。它已经被一个明确的CACHE INDEX语句分配到此关键缓存中。或者,表索引被预载入到默认的关键缓存中。LOAD INDEX INTO CACHE只用于MyISAM表。

IGNORE LEAVES修改符只会导致索引的非叶子节点被预载入。

对于表t1t2,以下语句会预载入索引的节点(索引组):

mysql> LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES;
+---------+--------------+----------+----------+
| Table   | Op           | Msg_type | Msg_text |
+---------+--------------+----------+----------+
| test.t1 | preload_keys | status   | OK       |
| test.t2 | preload_keys | status   | OK       |
+---------+--------------+----------+----------+

本语句会预载入所有来自t1的索引组。它只预载入来自t2的非叶子节点的组。

LOAD INDEX INTO CACHE语法允许您指定,只有来自表的特定的索引应被预载入。但是,当前实施会把所有的表索引预载入缓存中,所以一定要指定表名称,不能指定其它的。

13.5.5.5. RESET语法

RESET reset_option [, reset_option] ...

RESET语句被用于清除不同的服务器操作的状态。它也作为FLUSH语句的更强大的版本。请参见13.5.5.2节,“FLUSH语法”

为了执行RESET,您必须拥有RELOAD权限。

reset_option可以为以下的任何一项:

·         MASTER

可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件。(在以前版本的MySQL中,被称为FLUSH MASTER。)见13.6.1节,“用于控制主服务器的SQL语句”

·         QUERY CACHE

从查询缓存中取消所有的查询结果。

·         SLAVE

可以使从属服务器忘记其在主服务器二进制日志中的复制位置,另外,也可以通过删除原有的中继日志文件和开始一个新文件来重新设置中继日志。请参见13.6.2节,“用于控制从服务器的SQL语句”