mysql系列(三)——mysql架构与存储引擎

Wesley13
• 阅读 349

一、MySql逻辑架构

mysql系列(三)——mysql架构与存储引擎

1.连接层

mysql系列(三)——mysql架构与存储引擎

2.SQL服务层

  1. 组成部分

    (1)Sql Interface: 处理sql命令的接收及结果的返回 (2)Parser: 解析器,解析sql (3)Optimizer: 优化器,优化sql (4)Caches&Buffer: 缓存

  2. 查询命令的执行流程
    mysql系列(三)——mysql架构与存储引擎

  3. 解析器
    mysql系列(三)——mysql架构与存储引擎

  4. 优化器

explain SQL查询语句 :查看查询计划

  1. 缓存

sql的缓存是默认的,数据缓存需要手动开启(在my.cnf(linux)文件中配置)

//  查看缓存是否开启
show variables like '%query_cache_type%'
// 设置缓存大小
SET GLOBAL query_cache_size = 4000;
SET GLOBAL query_cache_size = 134217728;

3. 引擎层

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
  1. MyISAM
  • (1)MyISAM是Mysql5.5之前建表的默认引擎

  • (2)MyISAM创建表示创建的文件有三种如下案例

    mysql> create table t1(id int)ENGINE=MyISAM;

    Query OK, 0 rows affected (0.00 sec)

    [root@192 mysql]# ll ...... drwxr-x---. 2 mysql mysql 62 Jul 5 01:47 test [root@192 mysql]# cd test/ [root@192 test]# ll total 20 -rw-r-----. 1 mysql mysql 65 Jul 5 01:32 db.opt -rw-r-----. 1 mysql mysql 8556 Jul 5 01:47 t1.frm -rw-r-----. 1 mysql mysql 0 Jul 5 01:47 t1.MYD -rw-r-----. 1 mysql mysql 1024 Jul 5 01:47 t1.MYI

    .frm文件: 存储表结构的文件,任何引擎都有的文件 .MYD文件: 存储库数据的文件 .MYI文件: 存储索引的文件

  • (3)特性

    --并发性及锁级别:表锁 --支持全文索引 --支持数据压缩 myisampack -b -f tableName.MYI

  • (4)适合场景

    --支持非事务场景(数据仓库、报表、日志数据) --只读类应用 --空间类应用(空间函数、坐标)

  1. Innodb
  • (1)Innodb是Mysql5.5以后建表的默认引擎

  • (2)innodb_file_per_table

    mysql> show variables like '%innodb_file_per_table%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+

    1 row in set (0.00 sec)

    ----ON : 独立表空间(Mysql5.6及以后默认独立表空间)

    ----OFF : 系统表空间

    案例一:验证独立表空间(独立表空间在目录下生成".frm"文件和".idb"文件) mysql> use test; Database changed mysql> set global innodb_file_per_table=1; Query OK, 0 rows affected (0.00 sec) mysql> create table t2(id int,name varchar(100)); Query OK, 0 rows affected (0.03 sec) mysql> show variables like '%datadir%'; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | datadir | /var/lib/mysql/ | +---------------+-----------------+ 1 row in set (0.00 sec)


    [root@192 ~]# cd /var/lib/mysql/
    [root@192 mysql]# ll
    .......
    drwxr-x---. 2 mysql mysql       90 Jul  5 05:04 test
    [root@192 mysql]# cd test
    [root@192 test]# ll
    total 128
    ....... ( /var/lib/mysql/test)
    -rw-r-----. 1 mysql mysql  8586 Jul  5 05:04 t2.frm
    -rw-r-----. 1 mysql mysql 98304 Jul  5 05:04 t2.ibd
    

    案例二:验证系统表空间(在/var/lib/mysql 下生成共有的文件ibdataX,在/var/lib/mysql/test 下生成.frm文件) mysql> use test Database changed mysql> set global innodb_file_per_table=0; Query OK, 0 rows affected (0.00 sec)


    mysql> create table t3(id int,name varchar(100));
    Query OK, 0 rows affected (0.01 sec)
    
    [root@192 test]# pwd
    /var/lib/mysql/test
    [root@192 test]# ll
    ......
    -rw-r-----. 1 mysql mysql  8586 Jul  5 05:08 t3.frm
    [root@192 test]# cd ../
    [root@192 mysql]# ll
    total 188488
    ......
    -rw-r-----. 1 mysql mysql 79691776 Jul  5 05:09 ibdata1
    ......
    [root@192 mysql]# pwd
    /var/lib/mysql
    
  • (3)系统表空间和独立表空间区别

    1. 系统表空间无法简单的收缩表空间的大小
    2. 独立表空间可以通过optimize tableName收缩文件大小
    3. 系统表空间会产生IO瓶颈
    4. 独立表空间可以向多个文件刷新数据
  • (4)特性

    1. Innodb是一种事务性存储引擎

    2.完全支持事务ACID的特性 3. Redo log和Undo log 4. Innodb支持行级锁(并发程度更高)

  • (5)适合场景

    有事务处理的业务(OLTP)

  • (6)MyISAM与Innodb的比较

对比项

MyISAM

InnoDB

主外键

不支持

支持

事务

不支持

支持

行表锁

表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作行

行锁,操作时只锁某一行,不对其它行有影响;适合高并发的操作

缓存

只缓存索引,不缓存真实数据

不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响

表空间

关注点

性能

事务

默认安装

Y

Y

4 存储层

数据文件及日志文件

点赞
收藏
评论区
推荐文章
blmius blmius
1年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Stella981 Stella981
1年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
1年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
1年前
MySQL查询按照指定规则排序
1.按照指定(单个)字段排序selectfromtable_nameorderiddesc;2.按照指定(多个)字段排序selectfromtable_nameorderiddesc,statusdesc;3.按照指定字段和规则排序selec
Wesley13 Wesley13
1年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
1年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
1年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数NOW()相同的格式返回日期和时间?我知道如何使用date()做到这一点,但是我问是否有一个仅用于此的函数。例如,返回:2009120100:00:001楼使用此功能:functiongetDatetimeNow(){
Wesley13 Wesley13
1年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
京东云开发者 京东云开发者
1个月前
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
3A网络 3A网络
4个月前
开发一个不需要重写成 Hive QL 的大数据 SQL 引擎
开发一个不需要重写成HiveQL的大数据SQL引擎学习大数据技术的核心原理,掌握一些高效的思考和思维方式,构建自己的技术知识体系。明白了原理,有时甚至不需要学习,顺着原理就可以推导出各种实现细节。各种知识表象看杂乱无章,若只是学习
3A网络 3A网络
4个月前
理解 virt、res、shr 之间的关系(linux 系统篇)
理解virt、res、shr之间的关系(linux系统篇)前言想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了多少内存(物理内存)?通常我们可以通过t