1.1 定义数据库和实例

  • 数据库是物理操作系统文件或其他形式文件类型的集合
    • 依照某种数据模型组织起来并存放于二级存储器中的数据集合
  • 实例是MySQL数据库由后台线程以及一个共享内存区组成
    • 是程序,位于用户与操作系统之间的一层数据库管理软件,用户对数据库数据的任何操作,包括数据库定义、数据查询、数据维护、数据库运行控制等都是在数据库实例下进行的,应用程序只有通过数据库实例才能和数据库打交道。
  • MySQL数据库实例在系统上的表先就是一个进程
  • MySQL配置文件使用顺序
    • 配置文件中都有同一个参数,会以读取到的最后一个配置文件中的参数为准
1
2
mysql --help | grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

1.2 MySQL体系结构

MySQL由以下几部分组成:

  • 连接池组件
  • 管理服务和工具组件
  • SQL接口组件
  • 查询分析器组件
  • 优化器组件
  • 缓冲组件
  • 插件式存储引擎
  • 物理文件
1
2
MySQL数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎
存储引擎式基于表的,而不是数据库。

1.3 MySQL存储引擎

  • 用户可以根据MySQL预定义的存储引擎接口编写自己的存储引擎
  • MySQL官方手册的第16章给出了编写自定义存储引擎的过程

1.3.1 Innodb存储引擎

  • 主要面向在线事务处理(OLTP)的应用;
  • 特点是行锁设计、支持外键,支持非锁定读,默认读取操作不会产生锁;
  • 数据库5.5.8版本开始,为默认的存储引擎;
  • 数据放在一个逻辑的表空间中,自身进行管理;
  • 使用多版本并发控制(MVCC)来获得高并发性,实现SQL标准的4种隔离级别,默认为REPEATABLE级别;
  • 使用next-key locking 的策略来避免幻读(phantom);
  • 提供插入缓冲(insert buffer),二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)
  • 表中数据的存储,采用了聚集(clustered)的方式,每张表的存储都是按主键的顺序进行存放。表定义时没有指定注定,会为每一行生成一个6字节的ROWID,并以此做为主键。

1.3.2 MyISAM存储引擎

  • 不支持事务、表锁设计、支持全文索引
  • 缓冲池只缓冲索引文件、而不缓冲数据文件

1.3.3 NDB存储引擎

  • 集群存储引擎,结构式share nothing的集群架构,因此能提供更高的可用性
  • 特点是数据全部放在内存中
  • 连接操作(JOIN)是在MySQL数据库层完成的。复杂的连接操作需要巨大的网络开销,因此查询速度很慢。

1.3.4 Memory存储引擎

  • 表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失
  • 默认使用哈希索引
  • 适用于存储临时数据的临时表和数据仓库中的纬度表
  • 默认使用哈希索引

1.3.5 Archive存储引擎

  • 只支持INSERT和SELECT操作
  • 适合存储归档数据:如日志信息
  • 使用行锁实现高并发的插入操作
  • 设计目标主要是提供高速的插入和压缩功能

1.4 各存储引擎之间的比较

1.5 连接MySQL

  • TCP/IP
    • 任何平台下都提供的连接方式
  • 命名管道和共享内存
  • UNIX域套接字

问题

为什么MySQL数据库不支持全文索引?

  • 不!MySQL支持,MyISAM,InnoDB(1.2版本)和Sphinx存储引擎都支持全文索引

MySQL数据库速度快是因为不支持事务?

  • 错!虽然MySQL的MyISAM存储引擎不支持事务,但是InnoDB支持。

当表的数据量大于1000万时MySQL的性能会急剧下降吗?

  • 不!MySQL数据库,不是文件,随着数据行数的增加,性能当然会有所下降,但是这些下降不是线性的,如果用户选择了正确的存储引擎,以及正确的配置,再多的数据量MySQL也能承受。