数据库基础

MySQL 数据库基本介绍

  • 数据库的分类
    • 磁盘管理型
    • 内存管理型
  • 什么是数据库
    • 数据库(Database)是按照数据结构来组织、存储和管理数据的一个仓库
    • 专业的数据库是专门对数据进行创建、访问、管理和搜索等操作,比起我们自己用文件读写的方式对数据进行管理更加方便、快速、安全
  • 数据库的作用
    • 对数据进行持久化的保存
    • 方便数据的存储和查询,速度快、安全、方便
    • 可以处理并发访问
    • 更加安全的权限管理访问机制
  • 常见的数据库
    • 关系型数据库
      • MySQL
      • Oracle
      • PostgreSQL
      • SqlServer
    • 非关系型数据库
      • Redis 内存数据库
      • MongoDB 文档数据库
  • 关于数据库的概念
    • 数据库 Databases
    • 数据表 Tables
    • 数据字段
    • 行 row
    • 列 column

Windows 下安装 MySQL

  1. 在 MySQL 官网下载 zip 安装包(Windows x86,64bit)ZIP Archive
  2. 下载完成后解压,将其放到想要安装的目录下面 例如:D:\MySQL5.7\mysql-5.7.17-winx64
  3. 新建一个 my.ini 配置文件,内容如下:
1
2
3
4
5
6
7
8
9
10
11
[mysql]
default-character-set=utf8

[mysqld]
port = 3306
basedir=D:\MySQL5.7\mysql-5.7.17-winx64
datadir=D:\MySQL5.7\mysql-5.7.17-winx64\data
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
explicit_defaults_for_timestamp=true
  1. 在安装路径下新建一个空的 data 文件夹
  2. 以管理员身份运行 cmd,进入安装目录下的 bin 目录,执行 mysqld –initialize-insecure –user=mysql 命令。
  3. 依然在管理员窗口 cmd 下运行 mysqld install
  4. 继续执行命令 net start mysql 启动 MySQL 服务
  5. 修改环境变量,在环境变量中添加 D:\MySQL5.7\mysql-5.7.17-winx64\bin
  6. 在普通的 cmd 窗口下 进入 bin 目录 执行 mysql -u root -p 命令 默认没有密码

Mac 下安装 MySQL

下载安装 MySQL

brew install mysql@5.7

启动 MySQL

sudo mysql.server start

关闭 MySQL

sudo mysql.server stop

登录 MySQL

mysql -u root -p

认识和操作一下 MySQL 的基本命令

查看数据库

在登录 MySQL 之后,使用命令 show databases; 查看当前所有数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| db4 |
| django_bbs |
| djangoblog |
| information_schema |
| mysql |
| Mysql_Pro |
| performance_schema |
| students |
| sys |
+--------------------+
9 rows in set (0.02 sec)

选择数据库

当想要选择使用某个数据库的时候使用 use XXX; 命令

1
2
3
4
5
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

查看表

在进入一个数据库之后,可以先使用 show tables; 命令查看一下当前数据库下面所有的表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
mysql> show tables;
+------------------------------------------------------+
| Tables_in_mysql |
+------------------------------------------------------+
| columns_priv |
| component |
| db |
| default_roles |
| engine_cost |
| func |
| general_log |
| global_grants |
| gtid_executed |
| help_category |
| help_keyword |
| help_relation |
| help_topic |
| innodb_index_stats |
| innodb_table_stats |
| password_history |
| plugin |
| procs_priv |
| proxies_priv |
| replication_asynchronous_connection_failover |
| replication_asynchronous_connection_failover_managed |
| role_edges |
| server_cost |
| servers |
| slave_master_info |
| slave_relay_log_info |
| slave_worker_info |
| slow_log |
| tables_priv |
| time_zone |
| time_zone_leap_second |
| time_zone_name |
| time_zone_transition |
| time_zone_transition_type |
| user |
+------------------------------------------------------+
35 rows in set (0.00 sec)

查看表数据

想要查询表中的数据,使用 select * from XXX; 命令

1
2
3
4
5
6
7
8
9
10
11
mysql> select * from user;
+-----------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------------------+--------------------------+----------------------------+---------------+-------------+-----------------+----------------------+-----------------------+------------------------------------------------------------------------+------------------+-----------------------+-------------------+----------------+------------------+----------------+------------------------+---------------------+--------------------------+-----------------+
| Host | User | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections | plugin | authentication_string | password_expired | password_last_changed | password_lifetime | account_locked | Create_role_priv | Drop_role_priv | Password_reuse_history | Password_reuse_time | Password_require_current | User_attributes |
+-----------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------------------+--------------------------+----------------------------+---------------+-------------+-----------------+----------------------+-----------------------+------------------------------------------------------------------------+------------------+-----------------------+-------------------+----------------+------------------+----------------+------------------------+---------------------+--------------------------+-----------------+
| % | zachary | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | NULL | NULL | NULL | 0 | 0 | 0 | 0 | caching_sha2_password | $A$005$B?<M[emkFiH6r2qdU1jhF3ONtn8Pjzx.2mGkUGv24EjzSFpo6J6qZzZm9 | N | 2021-07-01 21:15:28 | NULL | N | N | N | NULL | NULL | NULL | NULL |
| localhost | mysql.infoschema | Y | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | NULL | NULL | NULL | 0 | 0 | 0 | 0 | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | N | 2021-02-16 20:09:44 | NULL | Y | N | N | NULL | NULL | NULL | NULL |
| localhost | mysql.session | N | N | N | N | N | N | N | Y | N | N | N | N | N | N | N | Y | N | N | N | N | N | N | N | N | N | N | N | N | N | | NULL | NULL | NULL | 0 | 0 | 0 | 0 | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | N | 2021-02-16 20:09:44 | NULL | Y | N | N | NULL | NULL | NULL | NULL |
| localhost | mysql.sys | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | | NULL | NULL | NULL | 0 | 0 | 0 | 0 | caching_sha2_password | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | N | 2021-02-16 20:09:44 | NULL | Y | N | N | NULL | NULL | NULL | NULL |
| localhost | root | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | | NULL | NULL | NULL | 0 | 0 | 0 | 0 | caching_sha2_password | $A$005$[v3;mqn}dytE6eHf1cnInBjCR5s.3TE1uHerOPadrzC83pYLSQCfO1y4 | N | 2021-02-16 20:13:33 | NULL | N | Y | Y | NULL | NULL | NULL | NULL |
+-----------+------------------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------------------+--------------------------+----------------------------+---------------+-------------+-----------------+----------------------+-----------------------+------------------------------------------------------------------------+------------------+-----------------------+-------------------+----------------+------------------+----------------+------------------------+---------------------+--------------------------+-----------------+
5 rows in set (0.00 sec)

表数据精确查看

但是这样数据太多又很乱,我们可以只选择其中一部分字段 select host,user from user;

1
2
3
4
5
6
7
8
9
10
11
mysql> select host,user from user;
+-----------+------------------+
| host | user |
+-----------+------------------+
| % | zachary |
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | root |
+-----------+------------------+
5 rows in set (0.00 sec)

创建自己的数据库

使用以下格式创建自己的数据库结构 create database 库名 default charset=utf8; 例如创建一个名为 tlxy 的数据库

1
2
mysql> create database tlxy default charset=utf8;
Query OK, 1 row affected, 1 warning (0.00 sec)

这是查看一下数据库,就会发现新增了一个数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| db4 |
| django_bbs |
| djangoblog |
| information_schema |
| mysql |
| Mysql_Pro |
| performance_schema |
| students |
| sys |
| tlxy |
+--------------------+
10 rows in set (0.00 sec)

创建自己的数据表

首先进入自己创建的数据库 use XXX;

1
2
mysql> use tlxy;
Database changed

然后使用以下格式创建自己想要的表结构 create table 表名(字段名 类型 字段约束,字段名 类型 字段约束,字段名 类型 字段约束,)engine==innodb default charset=utf8;

例如创建一个 user 表

1
2
3
4
5
6
create table user(
name varchar(20),
age int,
gender char(1)
)engine=innodb default charset=utf8;
Query OK, 0 rows affected, 1 warning (0.02 sec)

查看一下是否创建成功

1
2
3
4
5
6
7
mysql> show tables;
+----------------+
| Tables_in_tlxy |
+----------------+
| user |
+----------------+
1 row in set (0.00 sec)

显示表的字段结构

可以使用 desc XXX; 查看表的字段结构

1
2
3
4
5
6
7
8
9
mysql> desc user;
+--------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+-------+
| name | varchar(20) | YES | | NULL | |
| age | int | YES | | NULL | |
| gender | char(1) | YES | | NULL | |
+--------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

往表中添加数据

使用以下格式对已经创建好的表进行数据添加 insert into 表名(字段 1,字段 2,…) values(v1,v2,…)

例如,插入如下信息

1
2
mysql> insert into user(name,age,gender) values('admin',24,'男');
Query OK, 1 row affected (0.01 sec)

查看一下表中数据

1
2
3
4
5
6
7
mysql> select * from user;
+-------+------+--------+
| name | age | gender |
+-------+------+--------+
| admin | 24 | 男 |
+-------+------+--------+
1 row in set (0.00 sec)
1
2
mysql> insert into user(name,age,gender) values('duan',24,'女');
Query OK, 1 row affected (0.00 sec)
1
2
3
4
5
6
7
8
mysql> select * from user;
+-------+------+--------+
| name | age | gender |
+-------+------+--------+
| admin | 24 | 男 |
| duan | 24 | 女 |
+-------+------+--------+
2 rows in set (0.00 sec)

MySQL 基础操作命令

使用方法: 方式一:通过在命令行敲命令来操作(有助于命令的掌握) 方式二:通过图形界面工具,如 Navicat 等(在熟练掌握后在使用) 方式三:通过编程语言执行 MySQL 命令

SQL(Structure query language)结构化查询语言

SQL 语言分为 4 个部分:DDL(定义)、DML(操作)、DQL(查询)、DCL(控制)

SQL 语句中的快捷键

\G 格式化输出(文本式,竖立显示) \s 查看服务器端信息 \c 结束命令输入操作 \q 退出当前 sql 命令行模式 \h 查看帮助

操作数据库的步骤

连接、打开库、操作、关闭退出

1. 通过命令行连接 MySQL

mysql -h localhost -u root -p

-h 跟服务器地址 -u 为要登录的账号 -p 为密码 -P 为端口号

2. 数据库操作

查看数据库 show databases; 创建数据库 create database 库名 default charset=utf8; 删除数据库 drop database 库名; 打开数据库 use 库名;

3. 数据表操作

数据库管理系统中,可以有很多个库,每个库可以有很多个数据表

查看表 show tables; 创建表 create table 表名(字段名 1 类型, 字段名 2 类型)engine=innodb default charset=utf8;

创建表的时候,如果表不存在就执行这一条,如果表不存在就不执行这一条命令 create table if not exists 表名(字段名 1 类型, 字段名 2 类型)engine=innodb default charset=utf8;

1
2
3
4
5
6
create table if not exists users(
id int not null primary key auto_increment,
name varchar(4) not null,
age tinyint,
gender enum('男','女')
)engine=innodb default charset=utf8;

删除表 drop table 表名; 表结构 desc 表名; 查看建表语句 show create table 表名;

4. 数据操作 增删改查——CRUD

插入 insert into 表名(字段 1,字段 2,字段 3) values(值 1,值 2,值 3);**insert into 表名(字段 1,字段 2,字段 3) values(a 值 1,a 值 2,a 值 3), (b 值 1,b 值 2,b 值 3);**insert into 表名 values(值 1,值 2,值 3);

查询 select * from 表名;**********select 字段 1,字段 2,字段 3 from 表名;**

修改 update 表名 set 字段=某个值 where 条件;**update 表名 set 字段 1=值 1,字段 2=值 2 where 条件;**update 表名 set 字段=字段+值 where 条件;

删除 delete from 表名 where 字段=某个值

5. 退出 MySQL

exit;**********quit;**

MySQL 的基本常用数据类型

数据类型:整型、浮点型、字符串、日期等

1. 字符串数据类型

最常用的数据类型,可以用来存储名字、地址、电话、邮编

  • **定长串****CHAR**
  1. 接收长度固定的字符串,其长度是在创建表的时候指定的
  2. 指定长度后,就会分配固定的存储空间用于存放数据,如 CHAR(7)不管实际插入多少字符,都会占用 7 个字符位置
  • **变长串****VARCHAR**

VARCHAR(7) 如果实际插入 4 个字符,那么它只占 4 个字符位置,当然长度不能超过 7 个字符

数据类型 说明
CHAR 1~255 个字符的定长串。它的长度必须在创建时指定,否则 MySQL 假定为 CHAR(1)
ENUM 接受最多 64K 个串组成的一个预定义集合的某个串
LONGTEXT 与 TEXT 相同,但最大长度为 4GB
MEDIUMTEXT 与 TEXT 相同,但最大长度为 16K
SET 接受最多 64 个串组成的一个预定义集合的零个或多个串
TEXT 最大长度为 64K 的变长文本
TINYTEXT 与 TEXT 相同,但最大长度为 255 字节
VARCHAR 长度可变,最多不超过 255 字节。如果在创建时指定为 VARCHAR(n),则可以存储 0 到 n 个字符的变长串(其中 n≤255)

2. 数值类型

数据类型 说明
BIT 位字段,1~64 位(在 MySQL5 之前,BIT 在功能上等价于 TINYINT)
BIGINT 整数值,支持 -9223372036854775808~~~~~~9223372036854775807(如果是 UNSIGNED,为 0~~18446744073709551615)的数
BOOLEAN(BOOL) 布尔标志,或者为 0 或者为 1,主要用于开关(on/off)标志
DECIMAL(DEC) 精度可变的浮点值
DOUBLE 双精度浮点值
FLOAT 单精度浮点值
INT(INTEGER) 整数值,支持-2147483648~~~~~~2147483647(如果是 UNSIGNED,为 0~~4294967295)的数
MEDIUMINT 整数值,支持-8388608~~~~~~8388607(如果是 UNSIGNED,为 0~~16777215)的数
REAL 4 字节的浮点值
SMALLINT 整数值,支持-32768~~~~~~32767(如果是 UNSIGNED,0~~65535)的数
TINYINT 整数值,支持-128~~~~~~127(如果是 UNSIGNED,为 0~~255)的数

decimal(5,2) 表示数值总共 5 位,小数 2 位 tinyint 1 字节(8 位) int 4 字节(32 位)

3. 日期和时间类型

数据类型 说明
DATE 表示 1000-01-01~9999-12-31 的日期,格式为 YYYY-MM-DD
DATETIME DATE 和 TIME 的组合
TIMESTAMP 功能和 DATETIME 相同,范围更小
TIME 格式为 HH:MM:SS
YEAR 用 2 位数字表示,范围是 70(1970 年)~~~~~~69(2069 年),用 4 位数字表示,范围是 1901 年~~2155 年

练习 首先在 tlxy 数据库下创建了上面的 users 表格,相对的插入一些数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
mysql> insert into users(name,age,gender) values('段段',22, '女'),('黄黄',23,' 男'),('图图',1,'女');
Query OK, 3 rows affected (0.00 sec)

mysql> select * from users;
+----+--------+------+--------+
| id | name | age | gender |
+----+--------+------+--------+
| 1 | 段段 | 22 | 女 |
| 2 | 黄黄 | 23 | 男 |
| 3 | 图图 | 1 | 女 |
+----+--------+------+--------+
3 rows in set (0.00 sec)

mysql> update users set age=24 where name='段段';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select * from users;
+----+--------+------+--------+
| id | name | age | gender |
+----+--------+------+--------+
| 1 | 段段 | 24 | 女 |
| 2 | 黄黄 | 23 | 男 |
| 3 | 图图 | 1 | 女 |
+----+--------+------+--------+
3 rows in set (0.00 sec)

MySQL 的数据类型约束和主键

表的字段约束

  • unsigned 无符号(给数值类型使用,表示为正数,不写表示正负数都可以)
  • 字段后面加括号,可以限制宽度
    • char(5)、varchar(7) 在字符后面加限制表示字符串的长度
    • int(4) 没有意义,默认无符号的 int 为 int(11),有符号 int(10)
    • int(4) 只有在设置了前导零的时候才有意义,如 int(4) unsigned zerofill
  • not null 不能为空,在操作数据库的时候,如果输入该字段数据为空的时候就会报错
  • default 设置默认值
  • primary key 主键,不能为空 并且唯一,一般和自动递增配合使用
  • auto_increment 定义列为自增属性,一般用于主键,数值会自动加 1
  • unique 唯一索引(数据不能重复:用户名),可以增加查询速度,但是会降低插入和更新速度

MySQL 的运算符

  • 算术运算符: +**、**-**、*****、**/**** 、******%**
  • 比较运算符: =**、**>**、**<**、**>=**、**<=**、**!=
  • 数据库特有的比较: in**、**not in**、**is null**、**is not null**、**like**、**between**、**and
  • 逻辑运算符: and**、**or**、**not
  • like 支持特殊符号 %**、**_ ,用于模糊搜索
    • % : 可以表示任意数量的任意字符
    • _ : 表示任意一位字符
    • 例如: select * from users where name like ‘_段’;

主键

表中的每一行应该都有可以唯一标识自己的一列,用于记录两条不重复的记录,任意两行都不具有相同的主键值,便于后续的数据操纵和管理

要求:

  • 一旦插入表中,不要更改
  • 不允许 NULL
  • 不在主键列中使用可能会被更改的值
  • 自增整数类型
  • 可以使用多个列作为联合主键,但联合主键并不常用,实用多列作为主键时,所有列值的组合必须是唯一的

MySQL 数据库与数据表操作 数据表结构的修改

再来复习一次叭

创建一个数据库的流程

1.数据库的创建

1
2
3
4
5
6
7
8
# 链接MySQL数据库后,进入MySQL后可以操作数据

# 1. 创建库
create database if not exists tlxy default charset=utf8;

-- 1. 数据库 tlxy 如果不存在则创建数据库,存在则不创建
-- 2. 创建 tlxy 数据库,并设置字符集为utf8
-- 3. 无特殊情况都要求字符集为utf8或者utf8mb4的字符编码

2.查看数据库

1
2
# 1.查看所有数据库
show databases;

3.打卡库、进入库、选择库

1
2
# use 库名
use tlxy;

4.删除库

删库有风险

1
2
# 删除库 库中所有的数据都在磁盘中被删除
drop database 库名

在库中操作表的流程

1.创建表

语法格式为 create table 表名(字段名, 类型, 【字段约束】, …)

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建一个 users 表
create table users(
-- 创建ID字段,为正整数,不允许为空 主键,自动递增
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
-- 创建 存储 名字的字段 为字符串类型,最大长度五个字符,不允许为空
username VARCHAR(5) NOT NULL,
-- 创建 存储 密码的字段, 固定长度为32位字符,不允许为空
password CHAR(32) NOT NULL,
-- 创建 年龄 字段,不允许为空, 默认值为20
age TINYINT UNSIGNED NOT NULL DEFAULT 20
)engine=innodb default charset=utf8;

# 查看表结构
desc users;

# 查看建表语句
show create table users;

在这里的 password 使用的是 char(32)位字符,这是因为在数据库中 md5 的加密方式,不管密码多大加密的结果都是 32 位

创建表的原则

表名和字段名 尽可能的符合命名规范 并且最好能够见名知意 表中数据必须有唯一标识,即主键。无特殊情况,都为数字并自增即可 表中字段所对应的类型设置合理,并限制合理长度 表引擎推荐使用 innodb,无特殊情况都要求字符集为 utf8 或者 utf8mb4 的字符编码

2.修改表结构

语法格式为 alter table 表名 action(更改的选项)

实例

添加字段

语法: alter table 表名 add 添加的字段信息

1
2
3
4
5
6
7
8
9
10
11
-- 在 users 中 追加一个 num 字段
alter table users add num int not null;

-- 在 指定字段后 users 中 age字段后面 添加一个 email字段
alter table users add email varchar(50) after age;

-- 在 指定字段后 users 中 email字段后 添加一个 phone字段
alter table users add phone char(11) not null after age;

-- 在 表的最前面添加一个字段
alter table users add title int first;

删除字段

1
2
# 删除字段 alter table 表名 drop 被删除的字段名
alter table users drop title;

修改字段

语法格式 alter table 表名 change|modify 被修改的字段信息``change:可以修改字段名 modify:不能修改字段名

1
2
3
4
5
# 修改表中的 num 字段 类型
alter table users modify num tinyint not null default 12;

# 修改表中的 num 字段 为 int 类型 并且字段名更新为number
alter table users change num mm int;

3.修改表名

语法格式 alter table 原表名 rename as 新表名;

4.更改表中的自增的值

1
2
# 在常规情况下,auto_increment默认从1开始继续递增
alter table users auto_increment = 1000;

5.修改表引擎

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 推荐在定义表时候,表引擎为innodb

# 可以使用建表语句来查看当前表引擎

mysql> show create table users\G;
*************************** 1. row ***************************
Table: users
Create Table: CREATE TABLE `users` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(4) NOT NULL,
`age` tinyint DEFAULT NULL,
`gender` enum('男','女') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

ERROR:
No query specified


# 直接查看当前表引擎
mysql> show table status from tlxy where name = 'users'\G;
*************************** 1. row ***************************
Name: users
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 3
Avg_row_length: 5461
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 4
Create_time: 2022-04-10 16:10:12
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.01 sec)

ERROR:
No query specified


# 修改表引擎语句
alter table users engine = 'myisam';

6.删除表

语法格式 drop table 表名;

详解 MySQL 存储引擎

客户端向服务器发送的各类增删查改的请求

1
2
3
4
5
6
7
8
9
10
graph TD
A[客户端] --> B(处理连接)
B --> C(查询缓存)
C --> D(语法解析)
D --> E{查询优化}
E --> F[MyISAM]
E --> G[InnoDB]
E --> H[Memory]
E --> I[...]
G --> J(文件系统)

MySQL 服务器把数据的存储和提取都封装到了一个叫存储引擎的模块里。我们知道表是由一行一行的记录组成,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是存储引擎负责的事情。为了实现不同的功能,MySQL 提供了各式各样的存储引擎,不同的存储引擎管理的表具体的存储结构可能不同,采用的存取算法也可能不同。

存储引擎

存储引擎以前叫做表处理器,它的功能就是接收上层传下来的指令,然后对表中的数据进行提取或写入操作。

为了管理方便,人们把 连接管理、查询缓存、语法解析、查询优化这些并不涉及在真实数据存储的功能划分为 MySQL server 的功能,把真实存储数据的功能划分为存储引擎的功能。各种不同的存储引擎向上边的 MySQL server 层提供统一的调用接口(即 存储引擎 API),包含了几十个底层函数,像“读取索引第一条内容”、“读取索引下一条内容”、“插入记录”等等。

所以在 MySQL server 完成了查询优化之后,只需要按照生成的执行计划调用底层存储引擎提供的 API,获取到数据后返回给客户端就好啦

MySQL 支持非常多种存储引擎

存储引擎 描述
ARCHIVE 用于数据存档(行被插入后不能修改)
BLACKHOLE 丢弃写操作,读操作会返回空内容
CSV 在存储数据时,以逗号分隔各个数据项
FEDERATED 用来访问远程表
InnoDB 具备外键支持功能的事务存储引擎
MEMORY 置于内存的表
MERGE 用来管理多个 MyISAM 表构成的表集合
MyISAM 主要的非事务处理存储引擎
NDB MySQL 集群专用存储引擎

MyISAM 和 InnoDB 表引擎的区别

1)事务支持

MyISAM 不支持事务操作,而 InnoDB 支持

事务:访问并更新数据库中数据的执行单元,事务操作中,要么都执行要么都不执行

举个例子,黄黄给段段转钱,执行的语句是 黄黄扣钱,然后段段增加钱;那么如果发生了服务器断电的事件,因为有事务这一特性不会造成,黄黄扣钱之后,段段也没有增加钱这样的情况。

2)存储结构

MyISAM:每个 MyISAM 在磁盘上存储成三个文件

  • .frm 文件 存储表结构
  • .MYD 文件 存储数据
  • .MYI 文件 存储索引

InnoDB:主要分为两种文件进行存储

  • .frm 存储表结构
  • .ibd 存储数据和索引(也可能是多个.ibd 文件,或者是独立的表空间文件)

3)表锁差异

MyISAM:只支持表级锁,用户在操作 MyISAM 表时,select、update,delete,insert 语句都会给表自动加锁,如果加锁以后的表满足 insert 并发的情况下,可以在表的尾部插入新的数据。

InnoDB:支持事务和行级锁,是 InnoDB 的最大特色,行锁大幅度提高了多用户并发操作的性能,但是 InnoDB 的行锁,只是在 WHERE 的主键是有效的,而非主键的 WHERE 都会锁全表的。

4)表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址 InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个 6 字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。InnoDB 的主键范围更大,最大是 MyISAM 的 2 倍。

5)表的具体行数

MyISAM:保存有表的总行数,如果 select count() from table;会直接取出改值 InnoDB:没有保存表的总行数(只能遍历),如果使用 select count() from table;就会遍历整个表,消耗相当大,但是在加了 where 条件之后,MyISAM 和 InnoDB 处理的方式是一样的

6)CURD 操作

MyISAM:如果执行大量的 SELECT,MyISAM 是更好地选择 InnoDB:如果你的数据执行大量的 INSERT 或 UPDATE,出于性能方面考虑,应该使用 InnoDB 表。DELETE 从性能上 InnoDB 更优,但 DELETE FROM table 时,InnoDB 不会重新建立表,而是一行一行删除,在 InnoDB 上如果要清空保存有大量数据的表,最好使用 truncate table 这个命令

7)外键

MyISAM:不支持 InnoDB:支持

8)查询效率

推荐使用 InnoDB

9)MyISAM 和 InnoDB 两者的应用场景

  • MyISAM 管理非事务表,它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的 SELECT 查询,推荐使用 MyISAM
  • InnoDB 用于事务处理应用程序,具有众多特性,包括 ACID 事务支持。如果应用中需要执行大量的 INSERT 或者 UPDATE 操作,则应该使用 InnoDB 这样可以提高多用户并发操作的性能,现在默认使用 InnoDB

了解字符集中 utf8 和 utf8mb4 的区别

正常的 utf8 使用的是 1~4 字节的表示方式 但是在 MySQL 中,设计者设计了两个概念

  • utf8,即 utf8mb3:使用的是阉割版 utf8,只使用了 1~3 个字节表示字符
  • utf8mb4:就是上面正宗的 utf8,使用 1~4 个字节表示 当需要使用到类似于 emoji 等表情,就需要使用 utf8mb4

字符集的查看

使用命令 show character set;或者 show charset;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
mysql> show character set;
+----------+---------------------------------+---------------------+--------+
| Charset | Description | Default collation | Maxlen |
+----------+---------------------------------+---------------------+--------+
| armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 |
| ascii | US ASCII | ascii_general_ci | 1 |
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| binary | Binary pseudo charset | binary | 1 |
| cp1250 | Windows Central European | cp1250_general_ci | 1 |
| cp1251 | Windows Cyrillic | cp1251_general_ci | 1 |
| cp1256 | Windows Arabic | cp1256_general_ci | 1 |
| cp1257 | Windows Baltic | cp1257_general_ci | 1 |
| cp850 | DOS West European | cp850_general_ci | 1 |
| cp852 | DOS Central European | cp852_general_ci | 1 |
| cp866 | DOS Russian | cp866_general_ci | 1 |
| cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 |
| dec8 | DEC West European | dec8_swedish_ci | 1 |
| eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 |
| euckr | EUC-KR Korean | euckr_korean_ci | 2 |
| gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 |
| gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 |
| gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 |
| geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 |
| greek | ISO 8859-7 Greek | greek_general_ci | 1 |
| hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 |
| hp8 | HP West European | hp8_english_ci | 1 |
| keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 |
| koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 |
| koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 |
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
| latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 |
| latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 |
| latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 |
| macce | Mac Central European | macce_general_ci | 1 |
| macroman | Mac West European | macroman_general_ci | 1 |
| sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 |
| swe7 | 7bit Swedish | swe7_swedish_ci | 1 |
| tis620 | TIS620 Thai | tis620_thai_ci | 1 |
| ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
| ujis | EUC-JP Japanese | ujis_japanese_ci | 3 |
| utf16 | UTF-16 Unicode | utf16_general_ci | 4 |
| utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 |
| utf32 | UTF-32 Unicode | utf32_general_ci | 4 |
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_0900_ai_ci | 4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.01 sec)

更新: 2024-01-23 06:40:42
原文: https://www.yuque.com/zacharyblock/cx2om6/ovcglbg23nxq6bkh