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

Wesley13
• 阅读 743

一、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
3年前
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
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Android蓝牙连接汽车OBD设备
//设备连接public class BluetoothConnect implements Runnable {    private static final UUID CONNECT_UUID  UUID.fromString("0000110100001000800000805F9B34FB");
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这