mysql
本文档使用Mysql8
1. 安装mysql
debian12
denian9 开始debian官方库不再有Mysql, 只有MariaDB(Mysql的代替)
下载apt库安装包, 并安装
根据弹出的配置选项安装
安装Mysql
在安装时会提示输入root密码
centos9
denian9 开始debian官方库不再有Mysql, 只有MariaDB(Mysql的代替)
下载yum库安装包, 并安装
安装Mysql
启动Mysql
查看初始密码
修改密码初始
登陆Mysql
修改密码
2. 忘记密码
修改Mysql配置文件/etc/my.cnf
,跳过认证
连接Mysql
清空密码
修改Mysql配置文件/etc/my.cnf
, 删除skip-grant-tables
, 重启Mysql, 再连接Mysql将没有密码
设置新密码
3. 数据库操作
SQL分类
类型 | 描述 | 关键字 |
---|---|---|
DDL | 数据库定义语言, 创建和管理数据库或数据表 | CREATE, ALTER, DROP |
DML | 数据库操作语言, 操作数据 | INSERT, UPDATE, DELETE |
DQL | 数据库查询语言, 查询数据 | SELECT |
DCL | 数据库控制语言, 权限和事务控制 | GRANT, REVOKE, COMMIT, ROLLBACK |
数据库
4. 表
表引擎
引擎 | 支持 | 描述 | 事务 | 分布事务 | 保存点 |
---|---|---|---|---|---|
FEDERATED | NO | 能访问远程的MySQL数据库, 本地只保存表的结构数据, 远程保存了表的结构和数据 | null | null | null |
BLACKHOLE | YES | 写入的数据将被丢弃 | NO | NO | NO |
XENGINE | NO | 阿里自研的引擎 | null | null | null |
MEMORY | YES | 基于hash存储在内存 | NO | NO | NO |
InnoDB | DEFAULT | 支持事务, 行锁和外键 | YES | YES | YES |
PERFORMANCE_SCHEMA | YES | 性能表 | NO | NO | NO |
Sequence | YES | 序列引擎 | NO | NO | NO |
MyISAM | YES | 5.5版本之前的默认引擎, 支持表锁 | NO | NO | NO |
MRG_MYISAM | YES | 将多个MyISAM引擎的表聚合成一个表 | NO | NO | NO |
CSV | YES | 数据将存储到CSV文件中 | NO | NO | NO |
ARCHIVE | YES | 存储大量没有索引的数据 | NO | NO | NO |
表操作
约束条件
外键
数据类型
数值
整型数字的宽度是显示的宽度要配合零填充使用, 不会影响数据的存储宽度
类型 | 大小 | 有符号范围 | 无符号范围 |
---|---|---|---|
tinyint | 1 Byte | [-2^7, 2^7-1] | [0, 2^8-1] |
smallint | 2 Byte | [-2^15, 2^15-1] | [0, 2^16-1] |
mediumint | 3 Byte | [-2^23, 2^23-1] | [0, 2^24-1] |
int | 4 Byte | [-2^31, 2^31-1] | [0, 2^32-1] |
bigint | 8 Byte | [-2^63, 2^63-1] | [0, 2^64-1] |
浮点数
浮点数由符号,尾数(m), 基数(2)和指数(n)组成
浮点数大小 = 符号 * 尾数 * 2^指数
单精度(32位) = 符号位(1) + 指数(8) + 尾数(23)
双精度(64位) = 符号位(1) + 指数(11) + 尾数(52)
类型 | 大小 | 有符号范围 | 无符号范围 |
---|---|---|---|
float | 4 Byte (float(m,d), m是总的数字个数, d是小数后的数字个数, m最大255, d最大30) | [-3.402 823 466^38, -1.175 494 351^-38], 0, [1.175 494 351^-38, 3.402 823 466^38] | 0, [1.175 494 351^-38, 3.402 823 466^38] |
double | 8 Byte (double(m,d), m最大255, d最大30) | [-1.797 693 134 862 315^308, -2.225 073 858 507 201^-308], 0, [2.225 073 858 507 201^-308, 1.797 693 134 862 315^308] | 0, [2.225 073 858 507 201^-308, 1.797 693 134 862 315^308] |
decimal | decimal(m, n), m最大65, n最大30 |
字符串
一行记录最大65535个字节
- char(定长字符串) 最长255
char(10) 最多存10个字符, 超过10个字符将报错, 如果不足10个字符使用空格填充(如果数据后面有空格, 获取数据时将会被丢弃)
- varchar(变长字符串) 最长65535个字节, varchar(n) n的最大值会根据编码不同而变化
varcher(10) 最多存10个字符,超过10个字符将报错, 如果不足10个字符不会补空格
时间类型
类型 | 大小 |
---|---|
year | 年 |
date | 年月日 |
time | 时分秒 |
datetime | 年月日时分秒(1000年-9999年) |
timestamp | 年月日时分秒(1970年-2038年) |
枚举类型
集合类型
5. 记录操作
创建操作表
记录操作
查询测试表
多表查询
联合查询
子查询
6. 用户管理
权限
- ALL/ALL PRIVILEGES(所有权限)
- INSERT(插入权限)
- DELETE(删除权限)
- UPDATE(更新权限)
- SELECT(查询权限)
- CREATE(创建数据库或表)
- DROP(删除数据库, 表或视图)
- ALTER(修改字段或表)
7. 事务
保证一组sql语句执行, 保存这一组sql开始执行的状态, 在提交完成之前, 可以回滚到开始执行的状态
并发事务中的问题
- 脏读 一个事务未提交的事务被另一个事务读取到
- 不可重复读 一个事务两次读取数据不一样
- 幻读 一个事务查询一条记录不存在, 但在插入记录时, 由发现这一条记录
隔离级别 | 读未提交(READ-Uncommited) | 读已提交(Read-Commited) | 可重复读(REPEATABLE-READ) | 串行(SERIALIZABLE) |
---|---|---|---|---|
脏读 | Y | N | N | N |
不可重复读 | Y | Y | N | N |
幻读 | Y | Y | Y | N |
8. 索引
索引是一种有序的数据结构, 在MySQL中索引用于加速查找数据(在加快查找的同时,会降低增删改的速度)
- 聚集索引
存放行数据
- 二级索引
存放的是主键id
使用二级索引查找数据时, 先通过二级索引查找到主键id, 再通过主键id查询聚集索引找到数据, 这个过程称为回表查询
分类 | 描述 |
---|---|
主键索引 | |
唯一索引 | |
常规索引 | |
全文索引 |
9. 性能
PROFILE
索引失效
- 最左前缀原则(对于联合索引)
查询时索引最左列的必须存在, 并且不能跳过中间的索引列, 否则后面的索引将失效
- 索引上进行运算操作
前面模糊匹配
- OR条件有一侧没有索引
- 数据分布影响(通过索引比全表扫描慢时, mysql自动选择全表扫描)
sql提示
手动选择索引
覆盖索引
查询的时候使用了索引, 查询的列在索引中全部能找到, 就不需要回表查询
前缀索引
10. 优化
-
INSERT优化
- 批量插入
- 手动提交事务
- 大量数据 使用load导入文件
- 主键顺序插入
-
主键优化
- 数据的组织方式 根据主键的顺序存放
-
GROUP BY优化
-
ORDER BY优化
- 通过有序索引排序, 效率高
- 通过索引或者全表扫描, 在排序缓冲区排序, 效率慢
-
LIMIT 优化
-
count 优化
-
update 优化
- 根据有索引的字段更新, 不然会出现表锁
11. 视图
一种虚拟的表, 保存查询逻辑, 不保存查询数据
视图更新
视图中的行与基表中的行一一对应 如果有以下情况, 视图将不更新
- 聚合函数或窗口函数
- DISTINCT 去除
- GROUP BY 分组
- HAVING
- UNION