Mysql 启动!
入门
GUI 客户端,推荐 ** MySQL Workbench , GUI 操作****参考**
mysql 可以直接 docker 啦镜像直接跑。指定挂载卷 /var/lib/mysql
和 MYSQL_ROOT_PASSWORD
环境变量即可。
创建链接
终端中进入,使用经典命令 <font style="color:rgb(37, 41, 51);">mysql -u root -p</font>
然后输入 <font style="color:rgb(37, 41, 51);">MYSQL_ROOT_PASSWORD</font>
指定的密码即可进入 mysql 终端。✅
GUI 创建链接方法如下:
创建数据库 (schema | database)
1 |
|
从 MySQL5.0 开始,官方文档中开始使用 **<font style="color:rgb(37, 41, 51);">schema</font>**
来代替 **<font style="color:rgb(37, 41, 51);">database</font>**
来描述 MySQL 中的数据库。但是,实际上 MySQL 中的数据库仍然可以使用 database 来称呼,两者是等价的。
数据类型
整数类的有:TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT (就是存储空间的大小不同)
浮点型数字的有 FLOAT、DOUBLE
定点型数字的有 DECIMAL、MUMARIC
字符串型的有 CHAR、VARCHAR、TEXT 和 BLOB
日期型的有 DATE、TIME、DATETIME、TIMESTAMP
常用的也就这么几个:
- INT:存储整数
- TEXT: 存储不需要指定固定长度的各种字符集和编码文本
- VARCHAR(100): 存储变长字符串,可以指定长度
- CHAR:定长字符串,不够的自动在末尾填充空格
- DOUBLE:存储浮点数
- DATE:存储日期 2023-05-27
- TIME:存储时间 10:13
- DATETIME:存储日期和时间 2023-05-27 10:13
外键的得与失
(实际业务性能考虑确实很少用外键,一般用关系表、关联表:_xx_table_relation_)
好的地方
- 数据一致性。通过外键能保证相关表之间的数据一致性,减少数据错误。
- 数据完整性。外键可以实现数据在逻辑上是一个整体,有助于维护数据完整性。
- 外键可以帮助实现计算字段、自动插入等功能。
不好的地方
- 引入外键约束会增加数据库性能开销。对于大量数据的项目,外键约束检查会降低性能。
- 外键可能会限制数据库设计的灵活性。比如在 DELETE 或 UPDATE 操作中,外键约束可能会阻止你执行。
- 外键将业务逻辑引入到数据库。如果业务规则变更,数据库的外键也需要修改,增加维护难度。
何时使用
- 对于中小型项目,或需要保证数据高度一致性的项目,推荐使用外键。
- 对于大型项目或者改变频率高的业务,可以考虑不在数据库中直接定义外键关系,而是在应用层或使用 stored procedure(存储过程) 等方式来维护表间的数据一致性。
- 对于复杂的业务,完全不使用外键也不是一个好选择。你需要在性能、数据一致性和可维护性之间找到一个平衡点。
- 不管你选择使用还是不使用外键,最重要的是保持数据的高一致性和完整性。即权衡数据完整性,易维护性和性能开销的关系而做出选择。
事务与隔离级别
事务内的几条 sql 要么全部成功,要么全部不成功,事务就是为了保证数据的一致性。
使用 **<font style="color:rgb(37, 41, 51);">START TRANSACTION</font>**
开启事务
使用 **<font style="color:rgb(37, 41, 51);">ROLLBACK</font>**
恢复数据
执行 **<font style="color:rgb(37, 41, 51);">COMMIT</font>**
后即是提交,数据写死不可 <font style="color:rgb(37, 41, 51);">ROLLBACK</font>
了。
**<font style="color:rgb(37, 41, 51);">SAVEPOINT</font>**
设置保存点,然后使用 **<font style="color:rgb(37, 41, 51);">ROLLBACK TO SAVEPOINT</font>**
,回退到指定的保存点
1 |
|
四种事务隔离级别
**<font style="color:rgb(37, 41, 51);">READ UNCOMMITTED</font>**
:可以读到别的事务尚未提交的数据。- 这就有个问题,你这个事务内第一次读的数据是 aaa,下次读可能就是 bbb 了,这个问题叫做不可重复读。而且,万一你读到的数据人家又回滚了,那你读到的就是临时数据,这个问题叫做脏读。
**<font style="color:rgb(37, 41, 51);">READ COMMITTED</font>**
:只读取别的事务已提交的数据。- 这样是没有脏读问题了,读到的不会是临时数据。但是还是有可能你这个事务内第一次读的数据是 aaa,下次读可能是 bbb ,也就是不可重复读的问题依然存在。不只是数据不一样,可能你两次读取到的记录行数也不一样,这叫做幻读。
**<font style="color:rgb(37, 41, 51);">REPEATABLE READ</font>**
✅:在同一事务内,多次读取数据将保证结果相同。- 这个级别保证了读取到的数据一样,但是不保证行数一样,也就是说解决了不可重复读的问题,但仍然存在幻读的问题。
**<font style="color:rgb(37, 41, 51);">SERIALIZABLE</font>**
:在同一时间只允许一个事务修改数据。- 事务一个个执行,各种问题都没有了。但是负面影响就是性能很差,只能一个个的事务执行。
这 4 种级别主要是数据一致性和性能的差别,一致性越好,并发性能就越差。需要根据实际情况来权衡。一般就用默认的隔离级别就行,也就是
**<font style="color:rgb(37, 41, 51);">REPEATABLE READ</font>**
。
视图、存储过程与函数
不建议在生产中使用视图,存储过程和函数;这样可能把业务逻辑写到了数据库层,后续维护及其麻烦。所有这三只做了解即可
视图 (VIEW)
本质为了简化查询,之前要写一堆 sql,现在只要查这个视图就好了。视图一般只用来做查询,因为它增删改的限制比较多,比如只有单表的视图可以增删改,并且要求不在视图里的字段都有默认值等。
1 |
|
存储过程 (PROCEDURE)
存储过程可以封装一些 sql,用的时候传入参数 <font style="color:rgb(37, 41, 51);">CALL</font>
一下就行。
<font style="color:rgb(37, 41, 51);">DELIMITER</font>
指定 分隔符为 <font style="color:rgb(37, 41, 51);">$$</font>
覆盖默认分隔符 <font style="color:rgb(37, 41, 51);">;</font>
,为了方便 BEGIN…END 函数体内使用 <font style="color:rgb(37, 41, 51);">;</font>
,最后还是得恢复默认分隔符。
1 |
|
通过CALL
调用存储过程 **CALL** get_customer_orders(5)
函数 (FUNCTION)
默认 mysql 是不允许创建函数的。需要先设置这个变量:SET GLOBAL log_bin_trust_function_creators = 1
DECLARE
定义变量
<font style="color:rgb(37, 41, 51);">SELECT INTO</font>
是把结果放到 total 变量里。
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!