Client : Server :
实例: mysqld守护进程+线程(M,IO,SQL,Purge…)+预分配的内存(独占) 公司: boss+员工(经理,干活的)+ 办公区
Server层 (实例层) engine层 (存储层) 和磁盘交互。相当Linux文件系统 具体见图。 参考:https://www.jianshu.com/p/e872bc12f583
Linux MySQL 目录 库 文件 表
库: 库名 、库属性 表: 表名、表属性、列(列名、列属性)、行 -----》 元数据(数据字典)+数据
mysql> show databases; mysql> use mysql mysql> show tables;
cd /data/3306/data
库: 对应着 OS 中的目录 表: 例如: user 表 MyISAM user.frm : 存储数据字典信息(列相关信息) user.MYD : 存储数据行 user.MYI : 存储索引
servers 表 InnoDB servers.frm : 存储数据字典信息(列相关信息) servers.ibd : 存储数据行和索引
存储引擎:MySQL 内部的“文件系统”,和磁盘交互的结构。
segment(数据段) : 表的数据存放的位置,包含1-N个extent(区、簇) extent (区、簇) : 包含了连续的64个pages,默认1M。 page (数据页) : 最小IO单元,默认是16KB 。连续的4个OS block。
关系型数据库当中通用的查询语言。全名:结构化查询语言。
SQL-89 SQL-92 SQL-99 SQL-03
DDL : 数据定义语言 DCL : 数据控制语言 DML : 数据操作语言
5.7+ 之后采用的是严格模式。 作用: 为了让我们SQL在执行时更加严谨、有意义,符合常识、逻辑、符合科学等。。。 例子: 1. 日期格式: 2020-07-01 0000-00-00 2. 除法运算: 除数不能为0
查看SQL_MODE: mysql> select @@sql_mode; +-------------------------------------------------------------------------------------------------------------------------------------------+ | @@sql_mode | +-------------------------------------------------------------------------------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +-------------------------------------------------------------------------------------------------------------------------------------------+ 设置SQL_MODE: mysql> set sql_mode=''; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> select @@sql_mode; +------------+ | @@sql_mode | +------------+ | | +------------+ 1 row in set (0.00 sec) set sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> select @@sql_mode; +-------------------------------------------------------------------------------------------------------------------------------------------+ | @@sql_mode | +-------------------------------------------------------------------------------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +-------------------------------------------------------------------------------------------------------------------------------------------+utf8 和 utf8mb4 区别? 例如: utf8不完整,emoji表情字符是不支持,utf8mb4是支持的。 根本原因是,utf8 字符最大长度为3字节,utf8mb4是4字节。
校对规则(排序规则) mysql> show collation; 作用: 影响到了字符串的排序。作用: 约束存储的数据更加有意义,符合对于这个列的定义。
数字类型
字节量 范围 tinyint 1 0~255 -127~128 int 4 0~2^32-1 -2^31 ~2^31-1字符串类型 char(10) 定长类型的字符串类型。最多存储10个字符。如果存了5个,剩余空间用空格填充。
varchar(10) 变长类型的字符串类型。最多存储10个字符。如果存了5个,按需分配存储空间,另外需要1-2字节,存储字符长度。
怎么选择:一般情况下 变长字符串就用varchar,固定长度一般采用char类型
enum() : 枚举类型 应用场景: 列中的数据,有限个数的值的时候,并且是有规律。 enum(‘bj’,‘sh’,‘tj’,…) 1 2
时间日期 DATETIME 范围为从 1000-01-01 00:00:00.000000 至 9999-12-31 23:59:59.999999。TIMESTAMP 1970-01-01 00:00:00.000000 至 2038-01-19 03:14:07.999999。 timestamp会受到时区的影响
作用: 数据定义语言 。
库定义 创建库 CREATE DATABASE test CHARSET utf8mb4; CREATE DATABASE wordpress; 查询库 SHOW DATABASES; SHOW CREATE DATABASE test; SHOW CREATE DATABASE wordpress; 修改库 ALTER DATABASE wordpress CHARSET utf8mb4; 删除库(生产禁用!!!!) DROP DATABASE wordpress; 表定义 建表 USE test; CREATE TABLE stu ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号', sname VARCHAR(64) NOT NULL COMMENT '姓名', age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄', gender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性别', intime DATETIME NOT NULL COMMENT '入学时间' )ENGINE=INNODB CHARSET=utf8mb4 COMMENT '学生表'; 查表定义 SHOW TABLES; SHOW CREATE TABLE stu; DESC stu; 修改表定义 -- 添加和删除字段 -- 1. 在表中添加telnum char(11) not null unique key comment '手机号' ALTER TABLE stu ADD COLUMN telnum CHAR(11) NOT NULL UNIQUE KEY COMMENT '手机号'; -- 2. 在sname后添加a列 ALTER TABLE stu ADD COLUMN a INT NOT NULL COMMENT '测试列' AFTER sname; -- 3. 在第一列前添加b列 ALTER TABLE stu ADD COLUMN b INT NOT NULL COMMENT '测试列' FIRST ; -- 4. 删除添加的a,b列 ALTER TABLE stu DROP COLUMN a; ALTER TABLE stu DROP COLUMN b; -- 5. 修改数据类型 ALTER TABLE stu MODIFY telnum VARCHAR(20) NOT NULL UNIQUE KEY COMMENT '手机号'; ALTER TABLE stu MODIFY telnum VARCHAR(30) NOT NULL UNIQUE KEY COMMENT '手机号'; -- 6. 修改列名及数据类型 ALTER TABLE stu CHANGE telnum tel VARCHAR(64) NOT NULL UNIQUE KEY COMMENT '手机号'; 删除表 drop table stu; DDL语句开发规范库: CREATE DATABASE test CHARSET utf8mb4; 1. 库名要与业务有关 2. 库名不使用大写字母、数字开头。 3. 不要使用内置关键字 4. 建库要指定字符集。 5. 生产中禁止使用删库操作。
表: CREATE TABLE stu ( id INT NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '学号', sname VARCHAR(64) NOT NULL COMMENT '姓名', age TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '年龄', gender ENUM('m','f','n') NOT NULL DEFAULT 'n' COMMENT '性别', intime DATETIME NOT NULL COMMENT '入学时间' )ENGINE=INNODB CHARSET=utf8mb4 COMMENT '学生表'; 表名:与业务有关,例如:wp_users,不使用大写字母、数字开头,不要太长(16以下)设置存储引擎、字符集、表注释表名、列名要使用内置关键字列名要有意义,长度(16以下)数据类型:合适的、足够的、简短每个表要有主键,一般是自增长、无关列数字列。每个列尽量是not null ,可以配合default每个列要有注释修改定义的操作,要在业务不繁忙期间去做。如果紧急可以使用pt-osc 。