日期:2014-05-16  浏览次数:20527 次

《MySQL技术内幕:InnoDB存储引擎》-- 第1章 MySQL体系结构和存储引擎

来自:http://www.simpleframework.net/blog/v/11516.html

?

MySQL被设计为一个可移植的数据库,几乎能在当前所有的操作系统上运行,如Linux、Solaris、FreeBSD、Mac和Windows。尽 管各种系统在底层(如线程)实现方面各有不同,但是MySQL几乎能保证在各平台上的物理体系结构的一致性。所以,你应该能很好地理解MySQL在所有这 些平台上是如何工作的。

?

1.1 定义数据库和实例

?

在数据库领域中有两个词很容易混淆,它们就是“实例”(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的疑问还有很多很多,在我解释这些问题之前,我认为,不管使用哪种数据库,了解数据库的体系结构都是最为重要的。
在给出体系 结构图之前,我想你应该理解了前一节提出的两个概念:数据库和数据库