1、MySQL介绍

1.1、官网资料

MySQL官网


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)连接 

【MySQL】一、认识MySQL_MySQL


1.3、MySQL结构

【MySQL】一、认识MySQL_MySQL_02

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

官网介绍【8.0】

  • information_schema

记录Mysql的一些服务器信息(比如innoDB库信息、插件、引擎表等等)。官网介绍

【MySQL】一、认识MySQL_表空间_03

  • mysql

记录MySQL服务运行的一些元信息。官网介绍

【MySQL】一、认识MySQL_MySQL_04

  • performance_schema

监视Mysql服务器性能系统库 里面包含连接信息等,官网介绍如数据库连接状态:

【MySQL】一、认识MySQL_MySQL_05

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

  • sys

监视Mysql服务器性能系统库。官网介绍

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

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

【MySQL】一、认识MySQL_mysql_06



1.4、MySQL基本概念

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


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


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

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


  • 表空间

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

系统表空间

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

【MySQL】一、认识MySQL_表空间_07

ibdata1: 文件名

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

【MySQL】一、认识MySQL_mysql_08

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


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


通用表空间

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


  • 创建通用表空间
CREATE TABLESPACE sx_gen_tsp ADD DATAFILE '/var/lib/mysql/sx_gen.ibd' ENGINE=InnoDB;

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

【MySQL】一、认识MySQL_表空间_09


  • 创建表到通用表空间
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`;

创建成功后:

【MySQL】一、认识MySQL_表空间_10

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


独立表空间

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


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

【MySQL】一、认识MySQL_表空间_11


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


临时表空间

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


创建临时表用create TEMPORARY table语句


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


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


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