Mysql 启动!

入门

GUI 客户端,推荐 ** MySQL Workbench , GUI 操作****参考**


mysql 可以直接 docker 啦镜像直接跑。指定挂载卷 /var/lib/mysqlMYSQL_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
create database mydatabase

从 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_)

好的地方

  1. 数据一致性。通过外键能保证相关表之间的数据一致性,减少数据错误。
  2. 数据完整性。外键可以实现数据在逻辑上是一个整体,有助于维护数据完整性。
  3. 外键可以帮助实现计算字段、自动插入等功能。

不好的地方

  1. 引入外键约束会增加数据库性能开销。对于大量数据的项目,外键约束检查会降低性能。
  2. 外键可能会限制数据库设计的灵活性。比如在 DELETE 或 UPDATE 操作中,外键约束可能会阻止你执行
  3. 外键将业务逻辑引入到数据库。如果业务规则变更,数据库的外键也需要修改,增加维护难度。

何时使用

  1. 对于中小型项目,或需要保证数据高度一致性的项目,推荐使用外键。
  2. 对于大型项目或者改变频率高的业务,可以考虑不在数据库中直接定义外键关系,而是在应用层或使用 stored procedure(存储过程) 等方式来维护表间的数据一致性。
  3. 对于复杂的业务,完全不使用外键也不是一个好选择。你需要在性能、数据一致性和可维护性之间找到一个平衡点。
  4. 不管你选择使用还是不使用外键,最重要的是保持数据的高一致性和完整性。即权衡数据完整性,易维护性和性能开销的关系而做出选择。

事务与隔离级别

事务内的几条 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
START TRANSACTION;

SAVEPOINT aaa;

UPDATE order_items SET quantity=1 WHERE order_id=3;

SAVEPOINT bbb;

UPDATE orders SET total_amount=200 WHERE id=3;

SAVEPOINT ccc;


-- 回滚到bbb保存点
ROLLBACK TO SAVEPOINT bbb;

-- 提交
COMMIT

四种事务隔离级别

  • **<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
2
3
4
5
6
7
8
9
10
CREATE VIEW customer_orders AS
SELECT
c.name AS customer_name,
o.id AS order_id,
o.order_date,
o.total_amount
FROM customers c
JOIN orders o ON c.id = o.customer_id;

select * from customer_orders

存储过程 (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
2
3
4
5
6
7
8
DELIMITER $$
CREATE PROCEDURE get_customer_orders(IN customer_id INT)
BEGIN
SELECT o.id AS order_id, o.order_date, o.total_amount
FROM orders o
WHERE o.customer_id = customer_id;
END $$
DELIMITER ;

通过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
2
3
4
5
6
7
8
9
10
11
DELIMITER $$
CREATE FUNCTION get_order_total(order_id INT)
RETURNS DECIMAL(10,2)
BEGIN
DECLARE total DECIMAL(10,2);
SELECT SUM(quantity * price) INTO total
FROM order_items
WHERE order_id = order_items.order_id;
RETURN total;
END $$
DELIMITER ;

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!