mysql-logo.gif (3082 bytes)MySQL中文参考手册


第一章, 前一章, 下一章, 最后一章


9 MySQL服务器功能

9.1 MySQL支持哪些语言?

mysqld可以用下列语言发出错误消息:捷克语、荷兰语、英语(缺省)、爱沙尼亚语、法语、德语、匈牙利、意大利语、挪威语。

启动mysqld使用一种特定的语言,使用一个--language=lang-L lang选项。例如:

shell> mysqld --language=swedish

或:

shell> mysqld --language=/usr/local/share/swedish

注意,所有语言的名称用小写字母指定。

语言文件位于(缺省的)'mysql_base_dir/share/LANGUAGE/'

为了更新错误消息文件,你应该编辑“errmsg.txt”文件并且执行下列命令生成“errmsg.sys”文件:

shell> comp_err errmsg.txt errmsg.sys

如果你升级到一个更新的MySQL版本,记得要再次用新的“errmsg.txt”文件进行更新。

9.1.1 用于数据和排序的字符集

缺省地,MySQL使用 ISO-8859-1 ( Latin1 ) 字符集。这是在美国和西欧使用的字符集。

字符集决定了在名字中允许什么字符和如何由SELECT语句的ORDER BYGROUP BY子句排序。

通过给configure--with-charset=charset选项,你可以在编译时改变字符集。见4.7.1 快速安装概述

为了把其他字符集加入MySQL,使用下列过程:

9.1.2 增加一个新的字符集

  1. 为字符集选择一个名字,下面用MYSET表示。
  2. MySQL源代码分发中创造文件“strings/ctype-MYSET.c”
  3. 研究一个现有的“ctype-*.c'文件,看需要定义什么。注意,你文件中的数组必须有类似于ctype_MYSETto_lower_MYSET等等的名字。to_lower[]to_upper[]是简单的数组,保存字符集每个成员相应的小写和大写字符。例如:
    to_lower['A'] should contain 'a'
    to_upper['a'] should contain 'A'

    sort_order[]是一个映射,指出字符为了比较和排序目的应该如何定序。对于许多字符集,这与to_upper[]一样(意味着排序将忽略大小写)。MySQL将基于sort_order[character]值排序字符。ctype[]是一个位值的数组,一个元素对应一个字符。(注意,to_lower[]to_upper[]sort_order[]按字符定下标,但是ctype[]按字符值+1定下标。这是一个旧遗产以便能处理EOF) 你能在“m_ctype.h”找到下列bitmask定义:

    #define _U      01      /* Upper case */
    #define _L      02      /* Lower case */
    #define _N      04      /* Numeral (digit) */
    #define _S      010     /* Spacing character */
    #define _P      020     /* Punctuation */
    #define _C      040     /* Control character */
    #define _B      0100    /* Blank */
    #define _X      0200    /* heXadecimal digit */
    

    每个字符的ctype[]的入口应该是描述字符的适用的位模(bitmask)值的联合(union)。例如,'A'是一个大写字符(_U) ,同时是十六进制位(_X),这样ctype['A'+1]应该包含值:

    _U + _X = 01 + 0200 = 0201
    
  4. 为你的字符集增加一个唯一的编号到“include/m_ctype.h.in”
  5. 把字符集名字加到在configure.in中的CHARSETS_AVAILABLE表。
  6. 重新配置,重新编译并且测试。

9.1.3 多字节字符支持

如果你正在创建一个多字节字符集,你可以使用_MB宏。在“include/m_ctype.h.in”,增加:

#define MY_CHARSET_MYSET  X
#if MY_CHARSET_CURRENT == MY_CHARSET_MYSET
#define USE_MB
#define USE_MB_IDENT
#define ismbchar(p, end)  (...)
#define ismbhead(c)       (...)
#define mbcharlen(c)      (...)
#define MBMAXLEN          N
#endif

这里:

MY_CHARSET_MYSET 一个唯一的字符集值。
USE_MB 这个字符集有多字节字符,由ismbhead()mbcharlen()来处理。
USE_MB_IDENT (可选 ) 如果定义,你能使用多字节字符的表和列名。
ismbchar(p, e) 如果p不是一个多字节字符字符串,返回0,否则如果它是,返回字符的大小(字节数)。pe指向字符串的开始和结束。检查是从(char*)p(char*)e-1
ismbhead(c) 如果c是一个多字节字符字符串的第一个字符,返回真。
mbcharlen(c) 如果c是一个多字节字符串的第一个字符,返回该字符串的大小。
MBMAXLEN 在字符集中最大字符的字节大小。

9.2 更新日志

当以--log-update=file_name选项启动时,mysqld将所有更新数据的SQL命令写入记录文件中。文件被写入数据目录并且有一个名字file_name.#,这里#是一个数字,它在每次执行mysqladmin refreshmysqladmin flush-logsFLUSH LOGS语句、或重启服务器时加1。

如果你使用--log-l选项,mysqld用一个文件名“hostname.log”写一个通用的记录文件,并且重启和更新不会引起一个新的记录文件生成(尽管它被关闭并且再打开)。缺省地,mysql.server脚本用-l选项启动MySQL服务器,如果当你在生产环境中开始使用MySQL时,你需要好一些的性能,你可以从mysql.server中删除-l选项。

更新记录很聪明,因为它仅仅记载真正更新数据的语句。因此一个用WHEREUPDATEDELETE找不到行,它就不被写入记录文件。它甚至跳过将设置一个列为它已经有的值的UPDATE语句。

如果你想要从更新记录文件更新一个数据库,你可以如下做到(假设你的更新记录有“file_name.#”形式的名字):

shell> ls -1 -t -r file_name.[0-9]* | xargs cat | mysql

ls被用来以正确的次序得到所有的记录文件。

如果你必须在一个崩溃后恢复到备份文件并且你想要再做发生在备份和崩溃之间的更新,这可以很有用。

当你在其他主机上有一个镜像数据库并且你想要复制必须对主数据库进行的改变时,你也可以使用更新记录。

9.3 MySQL数据库表可以有多大?

MySQL 3.22 在表大小上有一个4G的限制。使用在MySQL 3.23中的新MyISAM 最大的表大小可达8百万 TB(2^63个字节)。

然而注意,操作系统有其自身文件大小的限制。在Linux上,当前的限制是2G;在Solaris 2.5.1上,限制是4G;在Solaris 2.6上,限制是1000G。这意味着MySQL表的大小通常由操作系统限制。

缺省地,MySQL表最大尺寸大约4G。你可用SHOW TABLE STATUS命令或myisamchk -dv table_name检查一个表的最大表大小。见7.21 SHOW句法(得到表、列等的信息)

如果你需要大于 4G 的表(并且你的操作系统支持它),你应该在你创建表时设定AVG_ROW_LENGTHMAX_ROWS参数。见7.7 CREATE TABLE语法。你也能用ALTER TABLE在以后设置这些。见7.8 ALTER TABLE语法

如果你的大表要变成只读,你可以使用myisampack合并并且把许多表压缩成一个。myisampack通常压缩一个表到至少50%,因此你可以有,实际上,更大的表。见12.5 MySQL压缩的只读的表生成器

另一个的解决方案可以是内含包括MERGE库,它允许你将一个许多相同的表的集合作为一个来处理。(在这种情况下相同意味着所有的表由相同的列信息创建)目前MERGE只能用于扫描一个表集合,因为它不支持索引。我们在不久的将来将把索引加进去。

9.4 MySQL数据库表类型

用MySQL,目前(版本 3.23.6)你可以在三种基本数据库表格式间选择。当你创建一张表时,你可以告诉MySQL它应该对于表使用哪个表类型。MySQL将总是创建一个.frm文件保存表和列定义。视表类型而定,索引和数据将在其他文件中存储。

你能用ALTER TABLE语句在不同类型的表之间变换。见7.8 ALTER TABLE语法

MyISAM
MySQL 3.23中,MyISAM是缺省表格类型,它是基于ISAM代码并且有很多有用的扩展。索引存储在一个有.MYI(MYindex)扩展名的文件并且数据存储在有.MYD(MYData)扩展名的文件中。你能用myisamchk实用程序检查/修复MyISAM表。见13.4 对崩溃恢复使用myisamchk。下列几点在MyISAM中是全新的:

MyISAM也支持下列东西,MySQL在不久的将来将能使用。

你也可以使用放弃的ISAM桌子类型。这将在不久消失,因为MyISAM是同一个东西的更好实现。ISAM使用一个B-tree索引,这个索引存储在一个有.ISM扩展名的文件中并且数据存储在有.ISD扩展名的文件中,你可用isamchk实用程序检查/修复ISAM表。见13.4 使用myisamchk恢复崩溃。ISAM表不是跨OS/平台二进制可移植的。ISAM有下列特征/属性:

HEAP 
HEAP表格使用一个杂凑(hashed)索引并且存储在内存中。这使他们更快,但是如果MySQL崩溃,你将失去所有存储的数据。HEAP作为临时表很可用!
CREATE TABLE test TYPE=HEAP SELECT ip,SUM(downloads) as down
        FROM log_table GROUP BY ip;
SELECT COUNT(ip),AVG(down) FROM test;
DROP TABLE test;

当你使用HEAP表时,这里是你应该考虑的一些事情:


第一章, 前一章, 下一章, 最后一章