MySQL事务
1.什么事务
用于保证数据的一致性,它是由一组相关的dml语句组成,该租的dml语句要么全部成功要么全部失败.
2.事务和锁
当执行事务操作时(dml),MySQL会在表上加锁,防止其它用户改表的数据,这对用户来说很重要
mysql 数据库控制台事务的几个重要操作(基本操作 transaction.sql):
-
1.
start transaction
-- 开始一个事务 -
2.
savepoint 保存点名
-- 设置保存点 -
3.
rollback to 保存点名
-- 回退事务到指定保存点 -
4.
rollback
-- 回退全部事务 -
5.
commit
-- 提交事务,所有的操作生效,不能回退
细节:
-
1.没有设置保存点
-
2.多个保存点
-
3.存储引擎
-
4.开始事务方式
操作步骤
1.开始事务
START TRANSACTION(事务,交易);
2.设置保存点
SAVEPOINT A;
执行dml操作
INSERT INTO t27 VALUES(100,'TOM'); 在t27表中插入一条数据 SELECT * FROM t27 查询插入的数据
3.回退操作
ROLLBACK TO
4.提交事务
COMMIT 事务提交后,不能回退修改
事务细节讨论 transaction_detail.sql:
-
1.如果不开始事务,默认情况下,DML操作是自动提交的,不能回滚。
-
2.如果开始一个事务,你没有创建保存点。你可以执行rollback,默认就是回退到你事务开始的状态。
-
3.你也可以在这个事务中(还没有提交时),创建多个保存点。比如:savepoint aaa;执行 DML,savepoint bbb;
-
4.你可以在事务没有提交前,选择回退到哪个保存点。
-
5.MySQL的事务机制需要InnoDB的存储引擎还可以使用,MyISAM不好使。
-
6.开始一个事务:start transaction,set autocommit=off;
-
1.自动提交模式:默认情况下,MySQL的DML(数据操纵语言)操作(如INSERT、UPDATE、DELETE)是自动提交的。这意味着每次执行一个DML语句后,更改都会立即生效,并且无法回滚。
-
2.手动事务控制:如果你开始了一个事务(使用
start transaction
或begin
命令),并且没有创建保存点,执行rollback
将会回退到事务开始的状态。 -
3.保存点的使用:在事务中,你可以创建多个保存点(使用
savepoint 保存点名
命令),这样你可以在事务未提交前回退到特定的保存点,而不是整个事务的开始状态。 -
4.选择性回退:在事务中,你可以选择回退到任何一个已创建的保存点(使用
rollback to 保存点名
命令)。 -
5.存储引擎要求:MySQL的事务机制需要使用InnoDB存储引擎,因为InnoDB支持事务处理。MyISAM存储引擎不支持事务,因此在使用事务时,必须确保表使用的是InnoDB存储引擎。
-
6.禁用自动提交:要开始一个事务,并手动控制提交和回滚,你可以使用
start transaction
命令,并且可以使用set autocommit=off
来关闭自动提交模式,这样DML操作就不会立即生效,直到你执行commit
命令。
MySQL事务隔离
事务隔离级别介绍:
-
1.多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性。(通俗解释)
-
2.如果不考虑隔离级别,可能会引发如下问题:脏读不可重复读幻读
-
脏读 (dirty read): 当一个事务读取另一个事务尚未提交的修改时,产生脏读。
-
不可重复读 (nonrepeatable read): 同一查询在同一事务中多次进行,由于其他提交事务所做的修改被删除,每次返回不同的结果集,此时发生不可重复读。
-
幻读 (phantom read): 同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读。
-
隔离级别 | 读未提交 (Read uncommitted) | 读已提交 (Read committed) | 可重复读 (Repeatable read) | 可串行化 (Serializable) |
---|---|---|---|---|
读未提交 (Read uncommitted) | V | V | V | 不加锁 |
读已提交 (Read committed) | x | V | V | 不加锁 |
可重复读 (Repeatable read) | x | x | x | 不加锁 |
可串行化 (Serializable) | x | x | x | 加锁 |
说明:V 可能出现,x 不会出现。
请注意,表格中的 "V" 和 "x" 代表某种行为或现象是否可能出现。具体到每个隔离级别下,"V" 表示该现象可能出现,而 "x" 表示该现象不会出现。例如,在 "读未提交" 隔离级别下,所有现象都可能出现(V),而在 "可串行化" 隔离级别下,所有现象都不会出现(x),并且会加锁以防止并发问题。
演示
1.登录MySQL
MySQL -uroot -p******
登录多个用户
查看MySQL用户隔离级别
SELECT @@tx_isolation(隔离) 默认隔离级别REPEATEABLE(重复)-READ
把其中一个用户隔离级别为 Read uncommitted
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
主要事务隔离必须要开启事务
创建表
CREATE TABLE 'ACCOUT'( id INT, 'name' VARCHAR(32), money INT; )
标题: MySQL事务隔离级别
步骤列表:
-
查看当前会话隔离级别
select @@tx_isolation;
-
查看系统当前隔离级别
select @@global.tx_isolation;
-
设置当前会话隔离级别
set session transaction isolation level repeatable read;
-
设置系统当前隔离级别
set global transaction isolation level repeatable read;
-
默认的事务隔离级别是 repeatable read。一般情况下,没有特殊要求,没有必要修改(因为该级别可以满足绝大部分项目需求)。
全局修改,修改my.ini配置文件,在最后加上
可选参数:
-
READ-UNCOMMITTED
-
READ-COMMITTED
-
REPEATABLE-READ
-
READ-SERIALIZABLE
输入框内容:
-
[mysql]
-
transaction-isolation = REPEATABLE-READ
事务的特性
-
1.原子性 (Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都不发生,要么都发生。
-
2.一致性 (Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
-
3.隔离性 (Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
-
4.持久性 (Durability) 持久性是指一个事务一旦提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
MYSQL约束
-
约束用于确保数据库的数据满足特定的商业约束条件。
-
在MySQL中,约束包括:NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, 和 CHECK 五种。
-
primary key:主键
-
foregin key : 外键
自增长:
auto_increment
MySQL索引
索引类型
-
1.
普通索引(INDEX):
-
最基本的索引类型,用于加速对表中单个列或多个列组合的查询。
-
-
2.
唯一索引(UNIQUE INDEX):
-
确保索引列中的所有值都是唯一的,不允许重复值。
-
-
3.
主键索引(PRIMARY KEY):
-
一种特殊的唯一索引,用于唯一标识表中的每一行。每个表只能有一个主键。
-
-
4.
全文索引(FULLTEXT INDEX):
-
用于文本字段,支持全文搜索功能。
-
-
5.
空间索引(SPATIAL INDEX):
-
用于地理空间数据类型,如空间数据。
-
索引的创建和使用
-
创建索引:
CREATE INDEX index_name ON table_name (column_name);
-
创建唯一索引:
CREATE UNIQUE INDEX index_name ON table_name (column_name);
-
创建主键索引:
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
-
创建全文索引
CREATE FULLTEXT INDEX index_name ON table_name (column_name);
-
删除索引:
DROP INDEX index_name ON table_name;
索引的注意事项
-
性能影响:
-
索引可以加快查询速度,但也会减慢数据插入、更新和删除的速度,因为索引本身也需要维护。
-
-
选择合适的列:
-
通常,应该为经常用于查询条件的列创建索引,如WHERE子句、JOIN条件和ORDER BY子句中的列。
-
-
避免过度索引:
-
不是每个列都需要索引。过多的索引会占用额外的存储空间,并且会降低数据修改操作的性能。
-
-
索引维护:
-
随着数据的增删改,索引可能变得碎片化,需要定期维护(如使用
OPTIMIZE TABLE
命令)。
-
-
使用EXPLAIN:
-
使用
EXPLAIN
关键字可以查看查询的执行计划,帮助你理解MySQL是如何使用索引的。
-
查看索引 SHOW TNDEXES FRPM TABLE_NAME; 添加索引 添加唯一索引 CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(列) CREATE INDEX INDEX_NAME ON TABLE_NAME(列)
MySQL的表类型和存储引擎
基本介绍
-
1.MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MyISAM、InnoDB、Memory等。
-
2.MySQL数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG MYISAM、MyISAM、InnoDB。
-
3.这六种又分为两类,一类是“事务安全型”(transaction-safe),比如:InnoDB;其余都属于第二类,称为“非事务安全型”(non-transaction-safe)[MyISAM 和 Memory]。
操作步骤
查看存储引擎
SHOW ENGINES;
主要的存储引擎/表类型特点
特点 | MyISAM | InnoDB | memory | archive |
---|---|---|---|---|
批量插入的速率 | 高 | 低 | 高 | 非常高 |
事务安全 | - | 支持 | - | - |
全文索引 | 支持 | - | - | - |
锁机制 | 表锁 | 行锁 | 表锁 | 行锁 |
存储限制 | 没有 | 64TB | 有 | 没有 |
B树索引 | 支持 | 支持 | 支持 | - |
哈希索引 | - | 支持 | 支持 | - |
集群索引 | - | 支持 | - | - |
数据缓存 | - | 支持 | 支持 | - |
索引缓存 | 支持 | 支持 | 支持 | - |
数据可压缩 | 支持 | - | - | 支持 |
空间使用 | 低 | 高 | N/A | 非常低 |
内存使用 | 低 | 高 | 中等 | 低 |
支持外键 | - | 支持 | - | - |
-
1.MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。
-
2.InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。
-
3.MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉,表的结构还在。
引擎选择
-
.如果你的应用不需要事务,处理的只是基本的CRUD操作,那么MyISAM是不二选择,速度快。
-
如果需要支持事务,选择InnoDB。
-
Memory 存储引擎就是将数据存储在内存中,由于没有磁盘I/O的等待,速度极快。但由于是内存存储引擎,所做的任何修改在服务器重启后都将消失。(经典用法 用户的在线状态().)
修改存储引擎
ALTER TABLE 'BIAOMING' ENGINE = 存储引擎
MySQL视图
-
1.视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)。
-
2.视图和基表关系的示意图
-
视图的基本使用
1.
create view 视图名 as select语句
- 创建一个视图。2.
alter view 视图名 as select语句
- 修改一个已存在的视图。3.
SHOW CREATE VIEW 视图名
- 显示创建视图的详细SQL语句。4.
drop view 视图名1, 视图名2
- 删除一个或多个视图。 -
完成前面提出的需求 view.sql 创建一个视图
emp_view01
,只能查询emp
表的(empno, ename, job, deptno)
信息。
CREATE VIEW emp_view01 AS SELECT empno, ename, job, deptno FROM emp;
修改数据
UPDATE EMP_VIEW01 SET job = 'MANAGER' WHERE EMPNO = 7369
视图最佳实践
-
1.安全。一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图,在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不查看保密字段。
-
2.性能。关系数据库的数据常常会分表存储,使用外键建立这些表之间的关系。这时,数据库查询通常会用到连接(JOIN)。这样做不但麻烦,效率相对也较低。如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用JOIN查询数据。
-
3.灵活。如果系统中有一张旧的数据表,这张表由于设计的问题,即将被废弃。然而,很多应用都是基于这张表,不易修改。这时就可以建立一张视图,视图中的数据直接映射到新建的表。这样,就可以少做很多改动,也达到了升级数据表的目的。
mysql查询
分页查询
SELECT * from emp oreder by empno(默认升序 asc) limit 0, 3;
降序desc
分组函数(增强)
//分组显示每种岗位的雇员总数,平均工资 SELECT COUNT(8), avg(sal), job FROM EMP GROUP BY JOB; //显示雇员总数,以及获得补助的雇员数 SELECT COUNT(*), count(comm) FROM emp; //统计没有获得补助的人数 SELECT COUNT(*),COUNT(IF(COMM IS NULL, 1, NULL)) //显示管理员的总数 SELECT COUNT(DISTINCT MGR) FROM emp; //显示雇员工资的最大差额 SELECT MAX(sal) - MIN(SAL) FROM emp;
统计各个部门的平均工资,并且是大于一千的,并且按照平均工资从高到底 取出前两行数据 SELECT deptno,AVG(SAL) AS AVG FROM emp GROUP BY DEPTNO HAVING AVG > 1000 ORDER BY AVGDESC LIMIT 0,2;
多表查询
-
多表查询是指基于两个表和两个以上的表查询。在实际应用中,查询单个表可能不能满足你的需求,需要使用到(dept表和emp表)。
-
多表查询练习 many tab.sql 显示雇员名,雇员工资及所在部门的名字【笛卡尔集】
SELECT * FROM EMP, DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO;
-
小技巧:多表查询的条件不能少于表的个数-1,否则会出现笛卡尔集。如何显示部门号为10的部门名,员工名和工资?显示各个员工的姓名,工资,及其工资的级别。
自连接:将同一张表看成两张
mysql用户管理
MySQL中的用户管理和权限管理是数据库安全和维护的关键部分。通过这些管理功能,你可以控制哪些用户可以连接到数据库服务器,以及他们可以执行哪些操作。以下是MySQL用户管理和权限管理的一些基本概念和命令:
用户管理
-
创建用户:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
这里,
'username'
是你想要创建的用户名,'host'
是用户可以从哪个主机连接(例如%
表示任何主机),'password'
是用户的密码。 -
删除用户:
DROP USER 'username'@'host';
-
修改用户密码:
SET PASSWORD FOR 'username'@'host' = PASSWORD('new_password');
或者
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';
-
查看用户:
SELECT User, Host FROM mysql.user;
权限管理
-
授予权限:
GRANT privileges ON database.table TO 'username'@'host';
其中
privileges
是你想要授予的权限列表,database.table
是权限适用的数据库和表。例如,SELECT, INSERT, UPDATE
等。 -
撤销权限
REVOKE privileges ON database.table FROM 'username'@'host';
-
查看权限:
SHOW GRANTS FOR 'username'@'host';
-
权限类型:
-
SELECT
:允许从表中选择数据。 -
INSERT
:允许向表中插入数据。 -
UPDATE
:允许更新表中的数据。 -
DELETE
:允许删除表中的数据。 -
ALTER
:允许使用ALTER TABLE命令。 -
CREATE
:允许创建新的数据库和表。 -
DROP
:允许删除数据库和表。 -
INDEX
:允许创建或删除索引。 -
GRANT OPTION
:允许用户将自己拥有的权限授予其他用户。
-
注意事项
-
权限的授予应该遵循最小权限原则,即只授予完成工作所必需的权限。
-
在生产环境中,建议使用SSL连接来加强安全性。
-
定期审查和更新用户权限,以确保数据库的安全性。
-
使用
FLUSH PRIVILEGES;
命令或重启MySQL服务来使权限更改生效。