1、MySQL介绍
1.1、官网资料
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)连接
1.3、MySQL结构
可以看到MySQL初始状态下会有四个默认的库:
- information_schema
记录Mysql的一些服务器信息(比如innoDB库信息、插件、引擎表等等)。官网介绍
- mysql
记录MySQL服务运行的一些元信息。官网介绍
- performance_schema
监视Mysql服务器性能系统库 里面包含连接信息等,官网介绍如数据库连接状态:
注意: 这个库里的表都是内存表,不使用磁盘的持久化,里边的数据会在数据库启动时自动填充,并随着数据库服务的停止而丢弃
- sys
监视Mysql服务器性能系统库。官网介绍
在数据目录中,如果我们新建了一个自己的库,则会自动创建一个对应名字的文件夹目录,里边存放的就是该数据库对应的数据
CREATE DATABASE `test001` CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci';
1.4、MySQL基本概念
这里不介绍什么数据库、表、字段、索引等概念,介绍一个我们不怎么关注的概念“表空间”和“存储引擎”
在我们的日常开发工作中,有多少人会关注表空间这个概念呢?基本上都是直接创建了数据库后就创建了表,而且创建表的方式也简单粗暴,用navicat或者类似数据库管理工具填一下字段名称、字段类型、字段长度、是否非空、默认值等,然后设置好主键和必要的索引就点保存创建表了,其它选项基本上都是用默认的
新什么事表空间和存储引擎?
表空间和存储引擎有哪些类型?
- 表空间
所谓表空间,可以简单理解为将一组数据从逻辑上归并到一起管理,查阅MySQL官网介绍,其中对于InnoDB存储引擎来说表空间有:
系统表空间
系统表空间可以有1个或者多个数据文件,默认情况下,在data目录中创建 一个名为ibdata1的系统表空间数据文件。系统表空间数据文件的大小和数 量由innodb_data_file_path启动选项定义
ibdata1: 文件名
12M: 文件大小 autoextend 自动扩容,扩容大小由innodb_autoextend_increment决定
默认扩容增量为64M,如果扩容到64M还不够,我们可以采用多个数据文件来提升系统表空间, 可以设置innodb_data_file_path,但是autoextend 只对最后一个文件生效。链接
为了减少系统表空间的大小,我们也可以用通用表空间,这样我可以自行 设置哪些表放在哪些表空间
通用表空间
与系统表空间类似,通用表空间是可以为多个表提供存储的共享空间,但是这个空间可以由我们自己维护管理
- 创建通用表空间
CREATE TABLESPACE sx_gen_tsp ADD DATAFILE '/var/lib/mysql/sx_gen.ibd' ENGINE=InnoDB;
创建成功后再数据目录会多出一个目录:
- 创建表到通用表空间
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已知的目录,比如datadir目录
独立表空间
独立表空间为每个表会创建一个文件,真正做到了解耦,易于管理,同时可以更大地利用磁盘空间。从逻辑来讲因为数据文件分散了,对于数据的存取也会更加高效
- 创建一个表,用默认InnoDB存储引擎,不指定表空间
查看对应数据库目录下的目录结构,会发现多出来一个名为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页