mysql体系结构图

发布时间: 2023-11-21 11:56 阅读: 文章来源:1MUMB2526PS
Mysql 体系结构

Mysql体系结构图

Mysql 由:SQL接口(连接池)、解析器、优化器、查询缓存、存储引擎 等组成

SQL接口、连接池

SQL接口:进行DML,DDL,存储过程,视图,触发器等操作和管理;用户通过SQL命令来查询所需要结果

连接池:管理用户的连接,线程管理等mysql> show variables like ‘%connection%‘;+--------------------------+-----------------+| Variable_name| Value|+--------------------------+-----------------+| character_set_connection | utf8|| collation_connection | utf8_general_ci || max_connections| 151 || max_user_connections | 0|+--------------------------+-----------------+解析器Mysql将用户的查询语句进行验证与解析,并创建一个内部的数据结构--语法树解析器由Lex和Yacc实现mysql> show variables like ‘optimizer_%‘;+------------------------+------------------------------------------------------------------------------------------------------------------------+| Variable_name| Value|+------------------------+------------------------------------------------------------------------------------------------------------------------+| optimizer_prune_level| 1|| optimizer_search_depth | 62 || optimizer_switch| index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on |+------------------------+------------------------------------------------------------------------------------------------------------------------+优化器

访问路径的统计数据,进行各种优化,如:重写查询、选择读取表的顺序以及索引等

查询缓存

存储select 语句以及相应的结果集。在解析查询之前服务器会先访问查询缓存。如果命中缓存最不会进行解析、优化

直接将结果返回

一般的缓存有:表缓存、记录缓存、key缓存、权限缓存等mysql> show variables like ‘%query_cache%‘;+------------------------------+----------+| Variable_name| Value|+------------------------------+----------+| have_query_cache | YES|| query_cache_limit| 1048576|| query_cache_min_res_unit | 4096 || query_cache_size | 16777216 || query_cache_type | ON|| query_cache_wlock_invalidate | OFF|+------------------------------+----------+ 存储引擎

存储引擎是Mysql与文件打交道的子系统。Mysql的存储引擎是插件式的,可根据MySql AB公司文件访问层来定制一种

访问机制(这种访问机制就叫存储引擎)

InnoDbMyIsam SQL执行过程

接受命令(用户验证、资源申请)、解析命令(SQL解析、生成语法树)、查询是否命中缓存、优化执行、执行(返回结果集)

mysql 分表

mysql分表有两种方式,一种是mysql本身的分区表,另一种是在语言层面以相应的字段取模或者以特定的算法进行分表

mysql 分区表

mysql 分区表对用户而言就是一个独立的逻辑表,但是底层由多个物理表组成。实现分区的代码实际上是对一组底层表的句柄

对象的封装。对分区表的请求,都会通过句柄对象转化为存储引擎的接口调用。使用partition by 子句定义每个分区的数据存放

分区表应用场景

表非常大以至于无法全部都放在内存中,或者只有表的最后部分有热点数据,其他都是历史数据分区表数据更容易维护数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备可以使用分区表避免某些特殊的瓶颈,如innodb的单个索引的互斥访问,ext3文件系统的inode锁竞争等

分区表的限制

一个表最多只能有1024个分区在msyql5.1中,分区表必须是整数,或者是返回整数的表达式。在mysql5.5中,某些场景可以直接使用列进行分区如果分区字段有主键或者唯一索引列,那么所有主键与唯一索引列必须包含进来分区表中无法使用外键

>注:分区表CRUD操作时会锁住所有底层表

逻辑分表

采用特定的算法进行分表,如:uid%100 即把用户表分为100个表,一般数据量大了无法处理时还可以进行分库。

同样的道理,进行某一个特定的字段取模或者其它算法。

优点

解决大中数据并发问题,CRUD时不会影响整个业务

缺点

数据维护起来比较麻烦,如给出指定的uid找相应的信息,你还得自己去算出在哪个表。(不过很明显,这优点大于缺点)

•••展开全文