出售域名!

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

译者:晏子 (clyan@sohu.com)      主页:http://getos.org


第一章, 前一章, 下一章, 最后一章目录.


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中是全新的:
  • 不用删除行,可以在表中INSERT一个新行,在其他线程从表中正在读取的同时。
  • 在支持大文件的文件系统/操作系统上支持大文件(63位)。
  • 所有的数据首先存储低字节,这使数据独立于机器和OS,唯一的要求是机器使用补2有符号整数(就像最近20年时间内的每台机器)和IEEE浮点格式(也在主流机器上完全主导地位)。不能支持二进制兼容性的机器的唯一领域是嵌入式系统(因为他们有时有古怪的处理器)。
  • 所有的数字键先存储高字节以获得更高的索引压缩。
  • AUTO_INCREMENT列的内部处理。MyISAM将自动地在INSERT/UPDATE时更新它。 AUTO_INCREMENT值可以用myisamchk重新设置,这将使得AUTO_INCREMENT列更快速并且原来的数将不象老的ISAM那样被重新使用。注意,当一个AUTO_INCREMENT定义在一个多部键值(multi-part-key)的结尾时,老式的行为仍然是存在。
  • BLOBTEXT列可以被索引。
  • 被索引的列允许NULL值。每个键占0-1个字节。
  • 现在最大的键长度缺省是500个字节。在键大于250个字节的情况下,一个大于缺省的1024个字节的关键字块大小被用于此键。
  • 每个表的键的最大数目放大到32作为缺省。这不必重新编译myisamchk就可以放大到64。
  • 在有一个标志MyISAM显示桌子是否正确被关上的文件。这将不久被用于自动的修理在MySQL服务器。
  • 现在myisamchk将标记表为“检查的”。myisamchk --fast将仅仅检查那些没有这个标记的表。
  • myisamchk -a存储键值组成部分的统计(不只是像ISAM对整个键)。
  • 现在在删除与更新和插入混用时,动态尺寸的行将有更少碎片,这通过自动合并相邻的删除块并且如果下一块被删除,通过扩大块来做到。
  • myisampack能紧缩BLOBVARCHAR列。

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

  • 支持一个真正的VARCHAR类型;一个VARCHAR列以2各字节存储的长度开始。
  • VARCHAR的表可以式固定或动态的记录长度。
  • VARCHARCHAR可以最大64K字节。所有的关键字片断有其自身的语言定义,这将使得MySQL每列有不同的语言定义。
  • 一个杂凑计算的索引可用于UNIQUE;这将允许你在一个表中的任何列组合上有UNIQUE属性。(然而,你不能搜索一个UNIQUE计算的索引。)

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

  • 压缩的且定长键
  • 固定和动态记录长度
  • 有16个键,每个键有16键组成部分
  • 最大键长度256(缺省)
  • 数据以机器格式存储;快速但是依赖于机器/OS 。
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表时,这里是你应该考虑的一些事情:

  • 你应该总是在CREATE语句中指定MAX_ROWS以保证你有意不使用所有的内存。
  • 索引将只能与与=<=>一起使用(但是很快)。
  • HEAP表使用一个固定的记录长度格式。
  • HEAP不支持BLOB/TEXT列。
  • HEAP不支持AUTO_INCREMENT列。
  • HEAP不支持在一个NULL列上的索引。
  • 你可以在一个HEAP表中有非唯一键(杂凑表一般不这样)。
  • HEAP表格在所有的客户之间被共享(就象任何其他的表)。
  • HEAP表的数据以小块分配。表是100%动态的(在插入时),无需溢出区和额外的键空间。删除的行放入一个链接表并且当你把新数据插入到表时,它将被再次使用。
  • 为了释放内存,你应该执行DELETE FROM heap_tableDROP TABLE heap_table
  • 为了保证你不会偶然做些愚蠢的事情,你不能创建比max_heap_table_size大的HEAP表。

第一章, 前一章, 下一章, 最后一章目录.