1、认识MySQL

1.1、官网资料

MySQL官网open in new window

1.2、MySQL安装【docker-compose方式安装】

编写docker-compose.yaml

version: '3'

services:
  mysql:
    image: registry.cn-hangzhou.aliyuncs.com/xhsx/mysql:8.0
    restart: always
    container_name: mysql8
    deploy:
      resources:
        limits:
          memory: 1024m
    environment:
      MYSQL_ROOT_PASSWORD: [这里改成你自己的root初始密码]
    ports:
    - 3307:3306
    volumes:
      - ./conf.d/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
      - ./datas:/var/lib/mysql
      - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime

说明:

  • conf.d目录为配置目录,这里是为了将MySQL的mysqld.cnf文件映射出来,方便特殊时候需要改动。
  • datas目录为数据目录,这里为了后面方便直接在docker宿主机目录查看数据
  • 最后一个docker挂载点是为了保证容器的时区和宿主机时区一致
  • ports这里做了一个端口号映射,将容器的3306端口映射成宿主机的3307端口,后续用宿主机的ip+3307端口访问
  • MYSQL_ROOT_PASSWORD这里记得改成自己的root账号初始密码

其中mysqld.cnf为随便找的一个MySQL默认的配置文件,具体内容如下:

# Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.

#

# This program is free software; you can redistribute it and/or modify

# it under the terms of the GNU General Public License, version 2.0,

# as published by the Free Software Foundation.

#

# This program is also distributed with certain software (including

# but not limited to OpenSSL) that is licensed under separate terms,

# as designated in a particular file or component or in included license

# documentation.  The authors of MySQL hereby grant you an additional

# permission to link the program and your derivative works with the

# separately licensed software that they have included with MySQL.

#

# This program is distributed in the hope that it will be useful,

# but WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

# GNU General Public License, version 2.0, for more details.

#

# You should have received a copy of the GNU General Public License

# along with this program; if not, write to the Free Software

# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

#

# The MySQL  Server configuration file.

#

# For explanations see

# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
#log-error      = /var/log/mysql/error.log

# By default we only accept connections from localhost

#bind-address   = 127.0.0.1

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0
log-bin=mysql-bin
binlog-format=ROW
server_id=1

执行:

# 在docker-compose.yaml文件所在目录执行命令:
docker-compose up -d

用数据库工具(如navicat)连接

image-20241110125601430

1.3、MySQL结构

image-20241110125646534

可以看到MySQL初始状态下会有四个默认的库:

官网介绍【8.0】open in new window

image-20241110125802390

image-20241110125838599

image-20241110125923332

注意: 这个库里的表都是内存表,不使用磁盘的持久化,里边的数据会在数据库启动时自动填充,并随着数据库服务的停止而丢弃

在数据目录中,如果我们新建了一个自己的库,则会自动创建一个对应名字的文件夹目录,里边存放的就是该数据库对应的数据

CREATE DATABASE `test001` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';

1.4、MySQL基本概念

这里不介绍什么数据库、表、字段、索引等概念,介绍一个我们不怎么关注的概念“表空间”和“存储引擎”

在我们的日常开发工作中,有多少人会关注表空间这个概念呢?基本上都是直接创建了数据库后就创建了表,而且创建表的方式也简单粗暴,用navicat或者类似数据库管理工具填一下字段名称、字段类型、字段长度、是否非空、默认值等,然后设置好主键和必要的索引就点保存创建表了,其它选项基本上都是用默认的

新什么事表空间和存储引擎?

表空间和存储引擎有哪些类型?

  • 表空间 所谓表空间,可以简单理解为将一组数据从逻辑上归并到一起管理,查阅MySQL官网介绍,其中对于InnoDB存储引擎来说表空间有:

系统表空间

系统表空间可以有1个或者多个数据文件,默认情况下,在data目录中创建 一个名为ibdata1的系统表空间数据文件。系统表空间数据文件的大小和数 量由innodb_data_file_path启动选项定义

image-20241110130112781

ibdata1: 文件名

12M: 文件大小 autoextend 自动扩容,扩容大小由innodb_autoextend_increment决定

image-20241110130131102

默认扩容增量为64M,如果扩容到64M还不够,我们可以采用多个数据文件来提升系统表空间, 可以设置innodb_data_file_path,但是autoextend 只对最后一个文件生效。链接open in new window

为了减少系统表空间的大小,我们也可以用通用表空间,这样我可以自行 设置哪些表放在哪些表空间

通用表空间

与系统表空间类似,通用表空间是可以为多个表提供存储的共享空间,但是这个空间可以由我们自己维护管理

创建通用表空间

CREATE TABLESPACE sx_gen_tsp ADD DATAFILE '/var/lib/mysql/sx_gen.ibd' ENGINE=InnoDB;

创建成功后再数据目录会多出一个目录:

image-20241110130334525

创建表到通用表空间

CREATE TABLE `test001`.`student`  (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `stu_no` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '学号',
  `stu_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '姓名',
  `birthday` date NULL COMMENT '出生日期',
  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '家庭住址',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `idx_stu_no`(`stu_no`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '学生表' TABLESPACE = `sx_gen_tsp`;

创建成功后:

image-20241110150605240

注意:通用表空间只能创建在MySQL已知的目录,比如datadir目录

独立表空间

独立表空间为每个表会创建一个文件,真正做到了解耦,易于管理,同时可以更大地利用磁盘空间。从逻辑来讲因为数据文件分散了,对于数据的存取也会更加高效

创建一个表,用默认InnoDB存储引擎,不指定表空间

image-20241110150641004

查看对应数据库目录下的目录结构,会发现多出来一个名为score.ibd的文件,同样操作再建别的表也会自动创建对应表名的ibd文件

临时表空间

在日常开发SQL中,有时候会用到临时表的逻辑,也就是会话是保持,会话结束后这个临时表就会失效。

创建临时表用create TEMPORARY table语句

在表空间中,数据都是由大小相同的page页组成的,默认page页大小为16k,可以根据参数innodb_page_size来设置, 参考链接

表空间内的数据并不是直接由page页组成的,而是划分为若干个segement段, 参考链接open in new window

每个segement段又是由若干个extent区组成的(如果一个页在16k以下,一个区的大小是1m,如果一个页32k,则一个区为2m,如果一个页64k则一个区4m)。磁盘的分配都是以区为单位分配的,一个区至少可以存储64个page页


点我关注