mysql索引,事务,约束

MySQL事务

1.什么事务

用于保证数据的一致性,它是由一组相关的dml语句组成,该租的dml语句要么全部成功要么全部失败.

2.事务和锁

当执行事务操作时(dml),MySQL会在表上加锁,防止其它用户改表的数据,这对用户来说很重要

mysql 数据库控制台事务的几个重要操作(基本操作 transaction.sql):

  1. 1.start transaction -- 开始一个事务

  2. 2.savepoint 保存点名 -- 设置保存点

  3. 3.rollback to 保存点名 -- 回退事务到指定保存点

  4. 4.rollback -- 回退全部事务

  5. 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 transactionbegin命令),并且没有创建保存点,执行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)VVV不加锁
读已提交 (Read committed)xVV不加锁
可重复读 (Repeatable read)xxx不加锁
可串行化 (Serializable)xxx加锁

说明: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事务隔离级别

步骤列表:

  1. 查看当前会话隔离级别

     select @@tx_isolation;
  2. 查看系统当前隔离级别

     select @@global.tx_isolation;
  3. 设置当前会话隔离级别

     set session transaction isolation level repeatable read;
  4. 设置系统当前隔离级别

     set global transaction isolation level 
     repeatable read;
  5. 默认的事务隔离级别是 repeatable read。一般情况下,没有特殊要求,没有必要修改(因为该级别可以满足绝大部分项目需求)。

全局修改,修改my.ini配置文件,在最后加上

可选参数:

  • READ-UNCOMMITTED

  • READ-COMMITTED

  • REPEATABLE-READ

  • READ-SERIALIZABLE

输入框内容:

  • [mysql]

  • transaction-isolation = REPEATABLE-READ

事务的特性

  1. 1.原子性 (Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都不发生,要么都发生。

  2. 2.一致性 (Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

  3. 3.隔离性 (Isolation) 事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

  4. 4.持久性 (Durability) 持久性是指一个事务一旦提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

MYSQL约束

  • 约束用于确保数据库的数据满足特定的商业约束条件。

  • 在MySQL中,约束包括:NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, 和 CHECK 五种。

  • primary key:主键

  • foregin key : 外键

自增长:

auto_increment

MySQL索引

索引类型

  1. 1.

    普通索引(INDEX):

    • 最基本的索引类型,用于加速对表中单个列或多个列组合的查询。

  2. 2.

    唯一索引(UNIQUE INDEX):

    • 确保索引列中的所有值都是唯一的,不允许重复值。

  3. 3.

    主键索引(PRIMARY KEY):

    • 一种特殊的唯一索引,用于唯一标识表中的每一行。每个表只能有一个主键。

  4. 4.

    全文索引(FULLTEXT INDEX):

    • 用于文本字段,支持全文搜索功能。

  5. 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;

主要的存储引擎/表类型特点

特点MyISAMInnoDBmemoryarchive
批量插入的速率非常高
事务安全-支持--
全文索引支持---
锁机制表锁行锁表锁行锁
存储限制没有64TB没有
B树索引支持支持支持-
哈希索引-支持支持-
集群索引-支持--
数据缓存-支持支持-
索引缓存支持支持支持-
数据可压缩支持--支持
空间使用N/A非常低
内存使用中等
支持外键-支持--
  • 1.MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。

  • 2.InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

  • 3.MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉,表的结构还在。

引擎选择

  1. .如果你的应用不需要事务,处理的只是基本的CRUD操作,那么MyISAM是不二选择,速度快。

  2. 如果需要支持事务,选择InnoDB。

  3. 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. 1.安全。一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图,在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不查看保密字段。

  2. 2.性能。关系数据库的数据常常会分表存储,使用外键建立这些表之间的关系。这时,数据库查询通常会用到连接(JOIN)。这样做不但麻烦,效率相对也较低。如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用JOIN查询数据。

  3. 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用户管理和权限管理的一些基本概念和命令:

用户管理

  1. 创建用户:

     CREATE USER 'username'@'host' IDENTIFIED BY 'password';

    这里,'username' 是你想要创建的用户名,'host' 是用户可以从哪个主机连接(例如 % 表示任何主机),'password' 是用户的密码。

  2. 删除用户:

     DROP USER 'username'@'host';
  3. 修改用户密码:

     SET PASSWORD FOR 'username'@'host' = PASSWORD('new_password');

    或者

     ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';
  4. 查看用户:

     SELECT User, Host FROM mysql.user;

权限管理

  1. 授予权限:

     GRANT privileges ON database.table TO 'username'@'host';

    其中 privileges 是你想要授予的权限列表,database.table 是权限适用的数据库和表。例如,SELECT, INSERT, UPDATE 等。

  2. 撤销权限

     REVOKE privileges ON database.table FROM 'username'@'host';
  3. 查看权限:

     SHOW GRANTS FOR 'username'@'host';
  4. 权限类型:

    • SELECT:允许从表中选择数据。

    • INSERT:允许向表中插入数据。

    • UPDATE:允许更新表中的数据。

    • DELETE:允许删除表中的数据。

    • ALTER:允许使用ALTER TABLE命令。

    • CREATE:允许创建新的数据库和表。

    • DROP:允许删除数据库和表。

    • INDEX:允许创建或删除索引。

    • GRANT OPTION:允许用户将自己拥有的权限授予其他用户。

注意事项

  • 权限的授予应该遵循最小权限原则,即只授予完成工作所必需的权限。

  • 在生产环境中,建议使用SSL连接来加强安全性。

  • 定期审查和更新用户权限,以确保数据库的安全性。

  • 使用FLUSH PRIVILEGES;命令或重启MySQL服务来使权限更改生效。

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值