在数据库领域中有两个词很容易混淆,它们就是“实例”(instance)和“数据库”(database)。作为常见的数据库术语,这两个词的定义如下。
- 数据库:物理操作系统文件或其他形式文件类型的集合。在MySQL中,数据库文件可以是frm、myd、myi、ibd结尾的文件。当使用NDB引擎时,数据库的文件可能不是操作系统上的文件,而是存放于内存之中的文件,但是定义仍然不变。
- 数据库实例:由数据库后台进程/线程以及一个共享内存区组成。共享内存可以被运行的后台进程/线程所共享。需要牢记的是,数据库实例才是真正用来操作数据库文件的。
这两个词有时可以互换使用,但两者的概念完全不同。在MySQL中,实例和数据库的通常关系是一一对应,即一个实例对应一个数据库,一个数据库对应一个实例。但是,在集群情况下可能存在一个数据库可被多个实例使用的情况。
MySQL被设计为一个单进程多线程架构的数据库,这点与SQL Server比较类似,但与Oracle多进程的架构有所不同(Oracle的Windows版本也是单进程多线程的架构)。这也就是说,MySQL数据库实例在系统上的表现就是一个进程。
在Linux操作系统中启动MySQL数据库实例,命令如下所示:
[root@xen-server bin]# ./mysqld_safe &
[root@xen-server bin]# ps -ef | grep mysqld
root 3441 3258 0 10:23 pts/3 00:00:00
/bin/sh ./mysqld_safe
mysql 3578 3441 0 10:23 pts/3 00:00:00
/usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql
--datadir=/usr/local/mysql/var --user=mysql
--log-error=/usr/local/mysql/var/xen-server.err
--pid-file=/usr/local/mysql/var/xen-server.pid
--socket=/tmp/mysql.sock --port=3306
root 3616 3258 0 10:27 pts/3 00:00:00 grep mysqld
请注意进程号为3578的进程,该进程就是MySQL实例。这里我们使用了mysqld_safe命令来启动数据库,启动MySQL实例的方法还有很多,在各种平台下的方式可能会有所不同。在这里不一一举例。
当 启动实例时,MySQL数据库会去读取配置文件,根据配置文件的参数来启动数据库实例。这与Oracle的参数文件(spfile)相似,不同的是,在 Oracle中,如果没有参数文件,启动时会提示找不到该参数文件,数据库启动失败。而在MySQL数据库中,可以没有配置文件,在这种情况 下,MySQL会按照编译时的默认参数设置启动实例。用以下命令可以查看,当MySQL数据库实例启动时,它会在哪些位置查找配置文件。
[root@xen-server bin]# ./mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
可 以看到,MySQL是按/etc/my.cnf→/etc/mysql/my.cnf→/usr/local/mysql/etc/my.cnf→~ /.my.cnf的顺序读取配置文件的。可能有人会问:“如果几个配置文件中都有同一个参数,MySQL以哪个配置文件为准?”答案很简单,MySQL会 以读取到的最后一个配置文件中的参数为准。在Linux环境下,配置文件一般放在/etc/my.cnf下。在Windows平台下,配置文件的后缀名可 以是.cnf,也可能是.ini。运行mysql -help命令,可以找到以下的内容:
Default options are read from the following files in the given order:
C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf
C:\Program Files\MySQL\M\MySQL Server 5.1\my.cnf
配置文件中有一个datadir参数,该参数指定了数据库所在的路径。在Linux操作系统下,datadir默认为/usr/local/mysql/data。当然,你可以修改该参数,或者就使用该路径,但该路径只是一个链接,如下所示:
mysql> show variables like 'datadir'\G;
*************************** 1. row ***************************
Variable_name: datadir
Value: /usr/local/mysql/data/
1 row in set (0.00 sec)1 row in set (0.00 sec)
mysql>system ls -lh /usr/local/mysql/data
total 32K
drwxr-xr-x 2 root mysql 4.0K Aug 6 16:23 bin
drwxr-xr-x 2 root mysql 4.0K Aug 6 16:23 docs
drwxr-xr-x 3 root mysql 4.0K Aug 6 16:04 include
drwxr-xr-x 3 root mysql 4.0K Aug 6 16:04 lib
drwxr-xr-x 2 root mysql 4.0K Aug 6 16:23 libexec
drwxr-xr-x 10 root mysql 4.0K Aug 6 16:23 mysql-test
drwxr-xr-x 5 root mysql 4.0K Aug 6 16:04 share
drwxr-xr-x 5 root mysql 4.0K Aug 6 16:23 sql-bench
lrwxrwxrwx 1 root mysql 16 Aug 6 16:05 data -> /opt/mysql_data/
从上面可以看到,其实data目录是一个链接,该链接指向了/opt/mysql_data目录。当然,必须保证/opt/mysql_data的用户和权限,使得只有mysql用户和组可以访问。
1.2 MySQL体系结构
由于工作的缘故,我很大一部分时间都花在对开发人员进行数据库方面的沟通和培训上。此外,不论他们是DBA,还是开发人员,似乎都 对MySQL的体系结构了解得不够透彻。很多人喜欢把MySQL与他们以前使用过的SQL Server、Oracle、DB2作比较。因此,我常常会听到这样的疑问:
- 为什么MySQL不支持全文索引?
- MySQL速度快是因为它不支持事务?
- 数据量大于1 000W时,MySQL的性能会急剧下降吗?
- ……
对于MySQL的疑问还有很多很多,在我解释这些问题之前,我认为,不管使用哪种数据库,了解数据库的体系结构都是最为重要的。
在给出体系 结构图之前,我想你应该理解了前一节提出的两个概念:数据库和数据库实例。很多人会把这两个概念混淆,即MySQL是数据库,MySQL也是数据库实例。 你这样来理解Oracle和SQL Server可能是正确的,但这对于以后理解MySQL体系结构中的存储引擎可能会带来问题。从概念上来说,数据库是文件的集合,是依照某种数据模型组织 起来并存放于二级存储器中的数据集合;数据库实例是应用程序,是位于用户与操作系统之间的一层数据管理软件,用户对数据库数据的任何操作,包括数据库定 义、数据查询、数据维护、数据库运行控制等,都是在数据库实例下进行的,应用程序只有通过数据库实例才能和数据库打交道。
如果这样讲解后你还是觉 得不明白,那我再换一种更直白的方式来解释:数据库是由一个个文件组成(一般来说都是二进制的文件)的,如果要对这些文件执行诸如SELECT、 INSERT、UPDATE和DETELE之类的操作,不能通过简单的操作文件来更改数据库的内容,需要通过数据库实例来完成对数据库的操作。所以,如果 你把Oracle、SQL Server、MySQL简单地理解成数据库,可能是有失偏颇的,虽然在实际使用中我们并不会这么强调两者之间的区别。好了,在给出上述这些复杂枯燥的定 义后,现在我们可以来看看MySQL数据库的体系结构了,如图1-1所示。
图1-1 MySQL体系结构
从图1-1我们可以发现,MySQL由以下几部分组成:
- 连接池组件。
- 管理服务和工具组件。
- SQL接口组件。
- 查询分析器组件。
- 优化器组件。
- 缓冲(Cache)组件。
- 插件式存储引擎。
- 物理文件。
从图1-1还可以看出,MySQL区别于其他数据库的最重要的特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管 理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引 擎开发者都可以按照自己的意愿来进行开发。
注意:存储引擎是基于表的,而不是数据库。请牢牢记住图1-1所示的MySQL体系结构图,它对于你以后深入了解MySQL有极大的帮助。
1.3 MySQL表存储引擎
1.2节大致讲解了MySQL数据库独有的插件式体系结构,并介绍了存储引擎是MySQL区别于其他数据库的一个最重要特性。存储引擎的好处是,每个存储 引擎都有各自的特点,能够根据具体的应用建立不同的存储引擎表。对于开发人员来说,存储引擎对其是透明的,但了解各种存储引擎的区别对于开发人员来说也是 有好处的。对于DBA来说,他们应该深刻地认识到MySQL的核心是存储引擎。
由于MySQL是开源的,你可以根据MySQL预定义的存储引擎接口编写自己的存储引擎,或者是如果你对某种存储引擎不满意,可以通过修改源码来 实现自己想要的特性,这就是开源的魅力所在。比如,eBay的Igor Chernyshev工程师对MySQL Memory存储引擎的改进(http://code.google.com/p/mysql-heap-dynamic-rows/),并应用于 eBay的Personalization Platform,Google和Facebook等公司也对MySQL进行了相类似的修改。我曾尝试过对InnoDB存储引擎的缓冲池进行扩展,为其添 加了基于SSD的辅助缓冲池,通过利用SSD的高随机读取性能来进一步提高数据库本身的性能。当然,MySQL自身提供的存储引擎已经足够满足绝大多数应 用的需求。如果你有兴趣,完全可以开发自己的存储引擎来满足自己特定的需求。MySQL官方手册的第16章给出了编写自定义存储引擎的过程,不过这已超出 了本书的范围。
由于MySQL的开源特性,存储引擎可以分为MySQL官方存储引擎和第三方存储引擎。有些第三方存储引擎很强大,如大名鼎鼎的InnoDB存储 引擎(现已被Oracle收购),其应用就极其广泛,甚至是MySQL数据库OLTP(Online Transaction Processing,在线事务处理)应用中使用最广泛的存储引擎。还是那句话,我们应该根据具体的应用选择适合的存储引擎,以下是对一些存储引擎的简单 介绍,以便于大家选择时参考。
1.3.1 InnoDB存储引擎
InnoDB存储引擎支持事务,主要面向在线事务处理(OLTP)方面的应用。其特点是行锁设计、支持外键,并支持类似于Oracle的非锁定 读,即默认情况下读取操作不会产生锁。MySQL 在Windows版本下的InnoDB是默认的存储引擎,同时InnoDB默认地被包含在所有的MySQL二进制发布版本中。
InnoDB存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由InnoDB自身进行管理。从MySQL 4.1(包括4.1)版本开始,它可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中。与Oracle类似,InnoDB存储引擎同样 可以使用裸设备(row disk)来建立其表空间。
InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为REPEATABLE级别。同时使 用一种被称为next-key locking的策略来避免幻读(phantom)现象的产生。除此之外,InnoDB储存引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。
对于表中数据的存储,InnoDB存储引擎采用了聚集(clustered)的方式,这种方式类似于Oracle的索引聚集表(index organized table,IOT)。每张表的存储都按主键的顺序存放,如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的 ROWID,并以此作为主键。
1.3.2 MyISAM存储引擎
MyISAM存储引擎是MySQL官方提供的存储引擎。其特点是不支持事务、表锁和全文索引,对于一些OLAP(Online Analytical Processing,在线分析处理)操作速度快。除Windows版本外,是所有MySQL版本默认的存储引擎。
MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。可以通过使用myisampack工具来进一步 压缩数据文件,因为myisampack工具使用赫夫曼(Huffman)编码静态算法来压缩数据,因此使用myisampack工具压缩后的表是只读 的,当然你也可以通过myisampack来解压数据文件。
在MySQL 5.0版本之前,MyISAM默认支持的表大小为4G,如果需要支持大于4G的MyISAM表时,则需要制定MAX_ROWS和 AVG_ROW_LENGTH属性。从MySQL 5.0版本开始,MyISAM默认支持256T的单表数据,这足够满足一般应用的需求。
注意:对于MyISAM存储引擎表,MySQL数据库只缓存其索引文件,数据文件的缓存交由操作系统本身来完成,这与其他使用LRU算法缓存数据 的大部分数据库大不相同。此外,在MySQL 5.1.23版本之前,无论是在32位还是64位操作系统环境下,缓存索引的缓冲区最大只能设置为4G。在之后的版本中,64位系统可以支持大于4G的索 引缓冲区。
1.3.3 NDB存储引擎
2003年,MySQL AB公司从Sony Ericsson公司收购了NDB 集群引擎(图1-1中Cluster引擎)。NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC集群;不过,与Oracle RAC share everything结构不同的是,其结构是share nothing的集群架构,因此能提供更高级别的高可用性。NDB的特点是数据全部放在内存中(从5.1版本开始,可以将非索引数据放在磁盘上),因此主 键查找(primary key lookup)的速度极快,并且通过添加NDB数据存储节点(Data Node)可以线性地提高数据库性能,是高可用、高性能的集群系统。
关于NDB存储引擎,有一个问题值得注意,那就是NDB存储引擎的连接操作(JOIN)是在MySQL数据库层完成的,而不是在存储引擎层完成 的。这意味着,复杂的连接操作需要巨大的网络开销,因此查询速度很慢。如果解决了这个问题,NDB存储引擎的市场应该是非常巨大的。
注意:MySQL NDB Cluster存储引擎有社区版本和企业版本,并且NDB Cluster已作为Carrier Grade Edition单独下载版本而存在,可以通过http://dev.mysql.com/ downloads/cluster/index.html获得最新版本的NDB Cluster存储引擎。
1.3.4 Memory存储引擎
Memory存储引擎(之前称为HEAP存储引擎)将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。它非常适合用于存储临时数据的临时表,以及数据仓库中的纬度表。它默认使用哈希索引,而不是我们熟悉的B+树索引。
虽然Memory存储引擎速度非常快,但在使用上还是有一定的限制。比如,其只支持表锁,并发性能较差,并且不支持TEXT和BLOB列类型。最 重要的是,存储变长字段(varchar)时是按照定常字段(char)的方式进行的,因此会浪费内存(这个问题之前已经提到,eBay的Igor Chernyshev工程师已经给出了Patch方案)。
此外有一点常被忽视的是,MySQL数据库使用Memory存储引擎作为临时表来存放查询的中间结果集(intermediate result)。如果中间结果集大于Memory存储引擎表的容量设置,又或者中间结果含有TEXT或BLOB列类型字段,则MySQL数据库会把其转换 到MyISAM存储引擎表而存放到磁盘。之前提到MyISAM不缓存数据文件,因此这时产生的临时表的性能对于查询会有损失。
1.3.5 Archive存储引擎
Archive存储引擎只支持INSERT和SELECT操作,MySQL 5.1开始支持索引。其使用zlib算法将数据行(row)进行压缩后存储,压缩比率一般可达1∶10。正如其名称所示,Archive存储引擎非常适合 存储归档数据,如日志信息。Archive存储引擎使用行锁来实现高并发的插入操作,但是本身并不是事物安全的存储引擎,其设计目标主要是提供高速的插入 和压缩功能。
1.3.6 Federated存储引擎
Federated存储引擎表并不存放数据,它只是指向一台远程MySQL数据库服务器上的表。这非常类似于SQL Server的链接服务器和Oracle的透明网关,不同的是,当前Federated存储引擎只支持MySQL数据库表,不支持异构数据库表。
1.3.7 Maria存储引擎
Maria存储引擎是新开发的引擎,设计目标主要是用来取代原有的MyISAM存储引擎,从而成为MySQL的默认存储引擎,开发者是MySQL 的创始人之一的Michael Widenius。因此,它可以看作是MyISAM的后续版本。其特点是:缓存数据和索引文件,行锁设计,提供MVCC功能,支持事务和非事务安全的选项 支持,以及更好的BLOB字符类型的处理性能。
1.3.8 其他存储引擎
除了上面提到的7种存储引擎外,还有很多其他的存储引擎,包括Merge、CSV、Sphinx和Infobright,它们都有各自适用的场合,这里不再一一做介绍了。了解了MySQL拥有这么多存储引擎后,现在我可以回答1.2节中提到的问题了。
- 为什么MySQL不支持全文索引?不!MySQL支持,MyISAM、Sphinx存储引擎支持全文索引。
- MySQL快是因为不支持事务吗?错!MySQL MyISAM存储引擎不支持事务,但是InnoDB支持。快是相对于不同应用来说的,对于ETL这种操作,MyISAM当然有其优势。
- 当表的数据量大于1 000W时,MySQL的性能会急剧下降吗?不!MySQL是数据库,不是文件,随着数据行数的增加,性能当然会有所下降,但是这些下降不是线性的,如果 你选择了正确的存储引擎以及正确的配置,再大的数据量MySQL也是能承受的。如官方手册上提及的,Mytrix和Inc.在InnoDB上存储了超过 1TB的数据,还有一些其他网站使用InnoDB存储引擎处理平均每秒800次插入/更新的操作。
1.4 各种存储引擎之间的比较
通过1.3节的介绍,我们了解了存储引擎是MySQL体系结构的核心。本节我们将通过简单比 较几个存储引擎来让读者更直观地理解存储引擎的概念。图1-2取自于MySQL的官方手册,展现了一些常用MySQL存储引擎之间的不同之处,包括存储容 量的限制、事务支持、锁的粒度、MVCC支持、支持的索引、备份和复制等。
图1-2 不同MySQL存储引擎相关特性的比较
可以看到,每种存储引擎的实现都不相同。有些竟然不支持事务,我相信在任何一本关于数据库原 理的书中,都可能会提到数据库与传统文件系统的最大区别在于数据库是支持事务的。而MySQL的设计者在开发时却认为不是所有的应用都需要事务,所以存在 不支持事务的存储引擎。更有不明其理的人把MySQL称作文件系统数据库,其实不然,只是MySQL的设计思想和存储引擎的关系可能让人产生了理解上的偏 差。
可以通过SHOW ENGINES语句查看当前使用的MySQL数据库所支持的存储引擎,也可以通过查找information_schema架构下的ENGINES表来查看,如下所示:
mysql> show engines\G;
*************************** 1. row ***************************
Engine: InnoDB
Support: YES
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: MyISAM
Support: DEFAULT
Comment: Default engine as of MySQL 3.23 with great performance
Transactions: NO
XA: NO
Savepoints: NO
8 rows in set (0.00 sec)
下面我将通过MySQL提供的示例数据库来简单显示各种存储引擎之间的区别。我们将分别运行以下语句,然后统计每次使用各种存储引擎后表的大小。
mysql> create table mytest engine=myisam as select * from salaries;
Query OK, 2844047 rows affected (4.37 sec)
Records: 2844047 Duplicates: 0 Warnings: 0
mysql> alter table mytest engine=innodb;
Query OK, 2844047 rows affected (15.86 sec)
Records: 2844047 Duplicates: 0 Warnings: 0
mysql> alter table mytest engine=ARCHIVE;
Query OK, 2844047 rows affected (16.03 sec)
Records: 2844047 Duplicates: 0 Warnings: 0
通过每次的统计我们发现,当最初的表使用MyISAM存储引擎时,表的大小为40.7MB,使用InnoDB存储引擎时表增大到了113.6MB,而使用Archive存储引擎时表的大小却只有20.2MB。该示例只从表的大小方面简单地揭示了各存储引擎的不同。
注 意:MySQL提供了一个非常好的用来演示MySQL各项功能的示例数据库,如SQL Server提供的AdventureWorks示例数据库和Oracle提供的示例数据库。就我所知,知道MySQL示例数据库的人很少,可能是因为这 个示例数据库没有在安装的时候提示用户是否安装(如Oracle和SQL Server),以及这个示例数据库的下载竟然和文档放在一起。可以通过以下链接找到示例数据库的下载地址:http://dev. mysql.com/doc/。
1.5 连接MySQL
本节将介绍连接MySQL数据库的常用方式。需要理解的是,连接MySQL操作是连接进程和MySQL数据库实例进行通信。从开发的角度来说,本质上是进 程通信。如果对进程通信比较了解,应该知道常用的进程通信方式有管道、命名管道、命名字、TCP/IP套接字、Unix域名套接字。MySQL提供的连接 方式从本质上看都是上述提及的进程通信方式。
1.5.1 TCP/IP
TCP/IP套接字方式是MySQL在任何平台下都提供的连接方式,也是网络中使用得最多的一种方式。这种方式在TCP/IP连接上建立一个基于 网络的连接请求,一般情况下客户端在一台服务器上,而MySQL实例在另一台服务器上,这两台机器通过一个TCP/IP网络连接。例如,我可以在 Windows服务器下请求一台远程Linux服务器下的MySQL实例,如下所示。
C:\>mysql -h192.168.0.101 -u david -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 18358
Server version: 5.0.77-log MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
这里的客户端是Windows,它向一台Host IP为192.168.0.101的MySQL实例发起了TCP/IP连接请求,并且连接成功。之后,就可以对MySQL数据库进行一些数据库操作,如DDL和DML等。
这里需要注意的是,在通过TCP/IP连接到MySQL实例时,MySQL会先检查一张权限视图,用来判断发起请求的客户端IP是否允许连接到MySQL实例。该视图在mysql库下,表名为user,如下所示。
mysql> use mysql;
Database changed
mysql> select host,user,password from user;
***************************** 1. row *****************************
host: 192.168.24.%
user: root
password: *75DBD4FA548120B54FE693006C41AA9A16DE8FBE
***************************** 2. row *****************************
host: nineyou0-43
user: root
password: *75DBD4FA548120B54FE693006C41AA9A16DE8FBE
***************************** 3. row *****************************
host: 127.0.0.1
user: root
password: *75DBD4FA548120B54FE693006C41AA9A16DE8FBE
***************************** 4. row *****************************
host: 192.168.0.100
user: zlm
password: *DAE0939275CC7CD8E0293812A31735DA9CF0953C
***************************** 5. row *****************************
host: %
user: david
password:
5 rows in set (0.00 sec)
从这张权限表中可以看到,MySQL允许david这个用户在任何IP段下连接该实例,并且不需要密码。此外,还给出了root用户在各个网段下的访问控制权限。
1.5.2 命名管道和共享内存
在Windows 2000、Windows XP、Windows 2003和Windows Vista以及在此之后的Windows操作系统中,如果两个需要通信的进程在同一台服务器上,那么可以使用命名管道,SQL Server数据库默认安装后的本地连接也使用命名管道。在MySQL数据库中,需在配置文件中启用--enable-named-pipe选项。在 MySQL 4.1之后的版本中,MySQL还提供了共享内存的连接方式,在配置文件中添加--shared-memory。如果想使用共享内存的方式,在连接 时,Mysql客户端还必须使用-protocol=memory选项。
1.5.3 Unix域套接字
在Linux和Unix环境下,还可以使用Unix域套接字。Unix域套接字其实不是一个网络协议,所以只能在MySQL客户端和数据库实例在 同一台服务器上的情况下使用。你可以在配置文件中指定套接字文件的路径,如-socket=/tmp/mysql.sock。当数据库实例启动后,我们可 以通过下列命令来进行Unix域套接字文件的查找:
mysql> show variables like 'socket';
*************************** 1. row ***************************
Variable_name: socket
Value: /tmp/mysql.sock
1 row in set (0.00 sec)
知道了Unix套接字文件的路径后,就可以使用该方式进行连接了,如下所示:
[root@stargazer ~]# mysql -udavid -S /tmp/mysql.sock
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20333
Server version: 5.0.77-log MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
1.6 小结
本章首先介绍了数据库和数据库实例的定义,紧接着分析了MySQL的体系结构,从而进一步突出强调了“实例”和“数据库”的区别。我相信,不管是 MySQL DBA还是MySQL的开发人员,都应该已经从宏观上了解了MySQL的体系结构,特别是MySQL独有的插件式存储引擎的概念。因为很多MySQL用户 很少意识到这一点,从而给他们的管理、使用和开发带来了困扰。
本章还详细讲解了各种常见的表存储引擎的特性、适用情况以及它们之间的区别,以便于大家在选择存储引擎时作为参考。最后强调一点,虽然MySQL 有许多存储引擎,但是它们之间不存在优劣性的差异,我们应根据不同的应用选择适合自己的存储引擎。当然,如果你能力很强,完全可以修改存储引擎的源代码, 甚至是创建自己需要的特定的存储引擎,这不就是开源的魅力吗?