|
MySQL中文参考手册
翻译:晏子(yanzi)
主页:http://linuxdb.yeah.net
第一章,
前一章, 下一章,
最后一章,目录.
这一节由MySQL开发者编写,因此应该理智地阅读它,但是没有我们听说的事实错误。
对于所有支持的限制、函数和类型的一个列表,看crash-me 网页。
- 性能
- 对于速度的真实比较,请教不断成熟的MySQL基准套件。见10.8
使用你自己的基准。因为没有线程创建开销、一个较小的语法分析器、较少功能和简单的安全性,
mSQL 应该在下列方面更快些:
- 执行重复的连接和断开的测试,在每个连接期间运行一个非常简单的查询。
- 有很少的列和键的插入很简单的表的
INSERT 操作。
CREATE TABLE 和DROP
TABLE 。
- 在不是一个索引的一些东西上
SELECT 。(一个表扫描是很容易的。)
因为这些操作是如此简单,当你有更高的启动开销时,很难在这些方面变得更好。在连接被建立以后,MySQL应该性能好一些。在另一方面,MySQL比mSQL (以及大多数其他的SQL实现)在下列方面更好些:
- 复杂的
SELECT 操作。
- 检索较大的结果(MySQL有一个更好、更快并且更安全的协议)。
- 有变长字符串的表,因为MySQL有更有效的并可在
VARCHAR 列上索引。
- 有很多列的表的处理。
- 由长记录的表的处理。
- 有很多许多表达式的
SELECT 。
- 在大表上的
SELECT 。
- 同时处理很多连接。MySQL充分是完全多线程化的,每个连接有它自己的线程,这意味着没有线程必须等待另一个线程(除非一个线程正在修改一张表,另外的线程想要存取)在
mSQL 中,一旦一个连接被建立了,所有其它线程必须等到第一个线程完成,不管连接正在运行的查询是短的或是长的。当第一个连接终止时,下一个才能工作,而此时所有其它线程再次等待,等等。
- 联结。如果你改变一个
SELECT 中的表的顺序,mSQL 可能变得异常地慢。在基准套件中,比MySQL要慢超过15000倍的时间。这是由于mSQL 缺乏一个联结优化器以便以最佳的顺序排定表。然而,如果你把表按完全正确的顺序放在mSQL 2中并且WHERE 是很简单的并使用索引列,联结将相对快些!见10.8
使用你自己的基准。
ORDER BY 和GROUP BY 。
DISTINCT 。
- 使用
TEXT 或BLOB 列。
- SQL功能
-
- 磁盘空间效率
- 即,你能使你的表有多小?MySQL有很精确的类型,因此你可以创建占据很小空间的表。一个有用的MySQL数据类型的例子是
MEDIUMINT ,它是3个字节长。如果你有100,000,000个记录,每个记录节省甚至一个字节也是很重要的。mSQL2 有一个较有限的列类型集合,因此更难于使表更小。
- 稳定性
- 这较难客观地评价。对于MySQL稳定性的讨论,见1.5
MySQL有多么稳定?。我们没有
mSQL 稳定性的经验,因此我们对此不能说任何东西。
- 价格
- 另一个重要的问题是许可证。MySQL有一个比
mSQL 更灵活的许可证,并且也不比mSQL 昂贵。无论你选择使用哪个产品,记得要至少考虑支付一个许可证或电子邮件支持的费用。(当然如果你把你出售的一个产品包括在MySQL中,你将被要求获得一个许可证。)
- Perl接口
- MySQL有与
mSQL 基本相同Perl接口,当有一些增加的功能。
- JDBC ( Java )
- MySQL目前有4个JDBC驱动程序:
- gwe 驱动程序:由GWE technologies 开发的一个Java接口(不再支持)。
- jms 驱动程序:由Xiaokun Kelvin ZHU的开发的一个改进的gwe驱动程序。
- twz 驱动程序:由Terrence W. Zellers 开发的一个type
4 JDBC驱动程序并用于学习目的。
- mm 驱动程序:由Mark Matthews 开发的一个type 4 JDBC驱动程序。
推荐的驱动程序是twz或mm驱动程序。两者均被报导工作出色。我们知道mSQL 有一个
JDBC 驱动程序,但是我们对它有太少的经验不能进行比较。
- 开发速度
- MySQL有一个非常小的开发者队伍,但是我们是非常习惯于用C和C++编码,非常快速。因为线程、函数、
GROUP
BY 等在mSQL 中仍未实现,它有很多追赶工作要做。要想得到关于它的一些前景,你可以查看mSQL 最后一年的
“HISTIRY”文件,并将它与MySQL参考书手册的新功能小节比较(见D
MySQL变迁历史)。哪个快开发得最快应该是相当明显的。
- 实用程序
mSQL 和MySQL都有许多有趣的第三方工具。因为向上移植(从mSQL 到MySQL)是很容易的,几乎所有mSQL 可用的有趣的应用程序也可被MySQL使用。MySQL带有一个简单的msql2mysql 程序修正在mSQL 和MySQL使用的大多数C
API函数之间拼写差别。例如,它将msqlConnect() 实例改变为mysql_connect() 。变换一个客户程序从mSQL 到MySQL通常花几分钟时间。
根据我们的经验,转换诸如使用mSQL C API的msql-tcl 和msqljava 工具将只花不大一小时时间,使得他们用MySQL
C API工作。
转换过程是:
- 在源代码上运行外壳脚本
msql2mysql 。这需要replace 程序,它与MySQL一起散发。
- 编译。
- 修正所有编译器错误。
mSQL C API与MySQL
C API 之间差别是:
- MySQL使用一个
MYSQL 结构作为一种连接类型(mSQL 使用一个int )。
mysql_connect() 取一个指向一个MYSQL 结构的指针作为一个参数。很容易定义全局性定义一个或使用malloc() 获得一个。mysql_connect() 也取两个参数指定用户和口令。你可以为了缺省使用将这些设置为NULL,NULL 。
mysql_error() 取MYSQL 结构作为一个参数。如果你正在移植老的代码,只是把参数加到你的老的msql_error() 编码中。
- MySQL对所有错误返回一个错误号和一条文本错误消息。
mSQL 仅返回一条文字错误消息。
- 存在某些不兼容性,因为MySQL支持从同一个进程的到服务器多个连接。
有足够的差别使得不可能(或至少不容易)支持两者。
它MySQL协议不同于mSQL 协议的最重要的方面列在下面:
- 一个消息缓冲区可以包含很多结果行。
- 如果查询或结果比当前缓冲区大,消息缓冲区动态地被扩大,直到一个可配置的服务器和客户上限。
- 所有的包被编号以捕捉重复或丢失的包。
- 所有的列值以ASCII码发送。列和行的长度以紧凑的二进制编码(1、2或3个字节)发送。
- MySQL能在未缓冲得结果中读取(不必在客户端存储完整的集合)。
- 如果一个单独写/读花了超过30秒时间,服务器关闭连接。
- 如果一个连接空闲8个小时,服务器关闭连接。
列类型
MySQL
- 有下列额外的类型(比较其他的;见7.7
CREATE TABLE 句法): 、
- 对于一个字符串集中之一的
ENUM 类型。
- 对于一个字符串集中多个的
SET 类型。
- 对于64位整数的
BIGINT 类型。
- MySQL也支持下列额外的类型属性:
mSQL2
mSQL 列类型对应于MySQL类型显示在下面:
mSQL 类型 |
相应的MySQL类型 |
CHAR(len) |
CHAR(len) |
TEXT(len) |
TEXT(len) ,len 是最大长度。并且LIKE 可运用。 |
INT |
INT ,有很多的选项! |
REAL |
REAL ,或FLOAT 。有4和8字节版本。 |
UINT |
INT UNSIGNED |
DATE |
DATE ,使用 ANSI SQL 格式而非mSQL 自己的。 |
TIME |
TIME |
MONEY |
DECIMAL(12,2) ,有2个小数位的定点值。 |
索引创建
MySQL
- 索引可以在表创建时用
CREATE TABLE 语句指定。
mSQL
- 在表被创建了以后,索引必须被创建,用单独的
CREATE INDEX 语句。
把一个唯一标识符插入到一张表中
MySQL
- 使用
AUTO_INCREMENT 作为列类型修饰符。见20.4.29
mysql_insert_id() 。
mSQL
- 在一张表上创建一个
SEQUENCE 并且选择_seq 列。
为行获得一个唯一标识符
MySQL
- 向表中增加一个
PRIMARY KEY 或UNIQUE 键。
mSQL
- 使用
_rowid 列。注意_rowid 可以将来改变,取决于很多因素。
得到列最后被修改的时间
MySQL
- 在表中增加一个
TIMESTAMP 列。如果你不给出列值或如果你给它一个NULL 值,该列自动为INSERT 或UPDATE 语句设置为当前的日期和时间。
mSQL
- 使用
_timestamp 列。
NULL 值的比较
MySQL
- MySQL遵从ANSI SQL且与
NULL 的比较总是NULL 。
mSQL
- 在
mSQL 中,NULL = NULL 是TRUE(真)。当从mSQL 到MySQL移植老的代码时,你必须将=NULL 改委IS
NULL ,并将<>NULL 改为IS NOT NULL 。
字符串的比较
MySQL
- 通常,字符串比较以大小写无关方式按当前字符集(缺省为ISO-8859-1 Latin1)决定的排序次序实施。如果你不喜欢这样,声明你的列有
BINARY 属性,它使得比较根据用在MySQL服务器主机上的ASCII顺序进行。
mSQL
- 所有的字符串比较以大小写敏感的方式以ASCII顺序排序来进行。
大小写不敏感的搜索
MySQL
LIKE 是一个大小写不敏感或大小写敏感的运算符,这取决于涉及的列。如果LIKE 参数不以一个通配符字符开始,如有可能,MySQL则使用索引。
mSQL
- 使用
CLIKE 。
尾部空格的处理
MySQL
- 剥去
CHAR 和VARCHAR 列尾部的空格。如果不希望这种行为,使用一个TEXT 行列。
mSQL
- 保留尾部的空格。
WHERE 子句
MySQL
- MySQL正确地优先化任何东西(
AND 在OR 前计算)。要想在MySQL里得到mSQL 的行为,使用括号(如下所示)。
mSQL
- 从左到右计算任何东西。这意味着超过3个参数的一些逻辑运算不能以任何方式表示,它也意味着当你升级到MySQL时,你必须改变一些查询。你通过增加括号很容易做到这点。假定你有下列
mSQL 查询:
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
为了使MySQL像mSQL 那样计算它,你必须增加括号:
mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));
存取控制
MySQL
- 有表来存储对每个用户、主机和数据库的授权(许可)选项。见6.6
权限系统如何工作。
mSQL
- 有一个文件“mSQL.acl”,在哪里你能为用户授权读/写权限。
-
PostgreSQL 有一些更高级的功能如定义用户类型、触发器、规则和一些事务支持。然而,PostgreSQL
缺乏很多来自 ANSI SQL和ODBC的很多标准类型和函数。对于一个完整的限制列表及其支持或不支持哪一个类型和函数,见crash-me 网页。
通常,PostgreSQL 是比MySQL慢很多。见10.8
使用你自己的基准。这大部分是由于他们的事务系统。如果你确实需要事务或PostgreSQL提供的丰富的类型体系并且你能承受速度的损失,你应该看看
PostgreSQL。
第一章,
前一章, 下一章,
最后一章,目录.
|