MySQL数据库原理

MySQL架构

  1. 连接池:最上层负责和客户端进行连接,比如jdbc,odbj这样的数据库连接的API,在这一层有连接池的概念,类似于线程池,连接池可以同时处理很多个数据库请求。同时这一层有SSL的安全概念,可以确保连接是安全的。
  2. SQL接口:当SQL语句进入MySQL后,会先到SQL接口中,这一层是封装层,将传过来的SQL语句拆散,将底层的结果封装成SQL的数据格式。
  3. 解析器:这一层负责将SQL语句进行拆分,验证,如果语句有问题那么就返回错误,如果没问题就继续向下执行。
  4. 优化器:对SQL查询的结果优化处理,产生多种执行计划,最终数据库会选择最优化的方案去执行,尽快返会结果。比如select a,b from c where d。在这里会先查询c表中符合d的数据并将他们的ab项进行投影,返回结果,并不会直接把整张表查出来。
  5. 缓存:对要查询的SQL语句进行hash后缓存,如果下一次是相同的查询语句,则在SQL接口之后直接返回结果。
  6. 存储引擎:MySQL有很多种存储引擎,每一种存储引擎有不同的特性,他们负责组织文件的存放形式,位置,访问文件的方法等等。比较常用的有innoDB,MyISAM,MAMORY等。
  7. 文件系统:存放数据的文件。



存储引擎

innoDB

优点:

  1. 支持事务,事务隔离级别,事务采用MVCC做多版本控制
  2. 支持外键,具有安全的约束性
  3. 主键是唯一的聚集索引,和数据存放在一起,效率高
  4. 可以有非聚集索引,非聚集索引单独存放,可以通过其查到聚集索引
  5. 对于死锁情况,innoDB会将持有最少排它锁的事务回滚

缺点:

  1. 占用磁盘较多
  2. 读效率慢于MyISAM

MyISAM

优点:

  1. 查询访问较快,因为读的时候不加锁
  2. 支持多种存储方式:静态表,动态表,压缩表等

缺点:

  1. 写入效率慢,因为写的时候会给整张表加锁
  2. 没有事务的概念
  3. 数据恢复起来比较困难

索引

  1. 越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。
  2. 简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。在MySQL中,应该用内置的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。
  3. 尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。

  4. 普通索引:最基本的索引,没有任何限制

  5. 唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值。

  6. 主键索引:它 是一种特殊的唯一索引,不允许有空值。 

  7. 全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。

  8. 组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。创建复合索引时应该将最常用(频率)作限制条件的列放在最左边,依次递减。符合最左原则,a,b,c做组合索引,可以查a;a,b;a,b,c但是无法查b开头的。

猜你喜欢

转载自blog.csdn.net/quinnnorris/article/details/80995298