Java学习笔记 --- MySQL-索引和事务
创始人
2024-05-03 19:23:52
0

一、索引

索引的原理

1、没有索引会全表扫描,从而查找速度会很慢

2、使用索引会形成一个索引的数据结构,比如二叉树

3、索引的代价

      磁盘占用

      对 dml(update、delete、insert)语句的效率影响

 

索引的类型

1、主键索引,主键自动的为主索引(类型Primary key)

2、唯一索引(UNIQUE)

3、普通索引(INDEX)

4、全文索引(FULLTEXT),一般开发不适用mysql自带的全文索引,而是使用:全文搜索Solr和ElasticSearch(ES)0

 

索引使用

添加索引

CREATE [UNIQUEINDEX index_name ON table_name (col_name[(length)]) [ASC| DESC],..);

添加主键索引

ALTER TABLE 表名 ADD PRIMARY KEY(列名,.....);

删除索引

DROP INDEX index_name ON table_name;

删除主键索引

ALTER TABLE table_name DROP PRIMARY KEY

查找索引

SHOW INDEX FROM table_name;

SHOW INDEXES FROM table_name;

SHOW KEYS FROM table_name;

DESC table_name;

哪些列上适合使用索引

1、较频繁的作为查询条件字段应该创建索引

2、唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件

3、更新非常频繁的字段不适合创建索引

4、不会出现在WHERE子句中字段不该创建索引

 

 

二、MySQL事务

什么是事务

        事务用于保存数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性

 

事务和锁

1、当执行事务操作时(dml语句),mysql会在表上加锁,防止其它用户改表的数据,这对用户来说非常重要

2、mysql数据库控制台事务的几个重要操作

1、开始一个事务:START TRANSACTION

2、设置保存点:SAVEPOINT

3、回退事务:ROLLBACK TO

4、回退全部事务:ROLLBACK

5、提交事务,所有的操作生效,不能回退:COMMIT

-- 事务的一个重要的概念和具体操作
-- 演示
CREATE TABLE t25(id INT,`name` VARCHAR(23)
);-- 开始事务
START TRANSACTION-- 设置保存点
SAVEPOINT a-- 执行dml操作
INSERT INTO t25 VALUES(100, 'tom')SAVEPOINT b-- 执行dml操作2
INSERT INTO t25 VALUES(200, 'jack')-- 回退到b保存点
ROLLBACK TO b-- 继续回退到a
ROLLBACK TO a-- 如果这样,表示直接回退到事务开始时的状态
ROLLBACK SELECT * FROM t25

 

回退事务

        介绍回退事务之前先介绍一下保存点(savepoint)。保存点是事务中的点,用于取消部分事务,当结束事务时(commit),会自动的删除该事务所定义的所有保存点。当执行回退事务时,通过指定保存点可以回退到指定的点

 

提交事务

        使用commit语句可以提交事务,当执行了commit语句后,会确认事务的变化、结束事务、删除保存点、释放锁、数据生效。当使用commit语句结束事务后,其他会话(其他连接)将可以查看到事务变化后的新数据(所有数据就正式生效)

 

事务的使用细节

1、如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚

2、如果开始一个事务,没有创建保存点,也是可以执行rollback,默认就是回退到事务开始的状态

3、可以在这个事务中(还没有提交时),创建多个保存点

4、可以在事务没有提交前,选择回退到哪个保存点

5、mysql的事务机制需要innodb的存储引擎才可以使用,myisam不好使

6、开始一个事务可以用start transaction,也可以使用set autocommit=off

-- 讨论 事务细节
-- 1. 如果不开始事务,默认情况下,dml 操作是自动提交的,不能回滚
INSERT INTO t25 VALUES(300,'milan'); -- 自动提交commitSELECT * FROM t25;-- 2. 如果开始一个事务,没有创建保存点,也是可以执行rollback,默认就是回退到事务开始的状态
START TRANSACTIONINSERT INTO t25 VALUES(400,'king');
INSERT INTO t25 VALUES(500,'scott');ROLLBACK -- 表示直接退回到事务开始时的状态-- 3. 你也可以在这个事务中(还没有提交时), 创建多个保存点.比如: savepoint aaa; 
-- 执行 dml , savepoint bbb-- 4. 你可以在事务没有提交前,选择回退到哪个保存点-- 5. InnoDB 存储引擎支持事务 , MyISAM 不支持-- 6. 开始一个事务 start transaction, set autocommit=off
SET autocommit=off

 

 

三、MySQL事务隔离级别

基本介绍

1. 多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性

2. 如果不考虑隔离性,可能会引发如下问题:脏读、不可重复读、幻读

 

查看事务隔离级别

脏读(dirty read):当一个事务读取另一个事务尚未提交的改变时,产生脏读

不可重复(nonrepeatable read):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读

幻读(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读

 

事务隔离级别

概念:Mysql隔离级别定义了事务与事务之间的隔离程度

 

设置事务隔离级别

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

select @@tx_isolation;

2、查看系统当前隔离级别

select @@global.tx_isolation;

3、设置当前会话隔离级别

set global transaction isolation level repeatable read; 

4、设置系统当前隔离级别

set global transaction isolation level repeatable read;

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

-- 演示 mysql 的事务隔离级别
-- 1. 开了两个 mysql 的控制台-- 2. 查看当前 mysql 的隔离级别
SELECT @@tx_isolation; 
-- mysql> SELECT @@tx_isolation; 
-- +-----------------+
-- | @@tx_isolation | 
-- +-----------------+
-- | REPEATABLE-READ | 
-- +-----------------+-- 3.把其中一个控制台的隔离级别设置 Read uncommitted
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED-- 4. 创建表
CREATE TABLE `account`(id INT, `name` VARCHAR(32),money INT
);-- 查看当前会话隔离级别
SELECT @@tx_isolation-- 查看系统当前隔离级别
SELECT @@global.tx_isolation-- 设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED-- 设置系统当前隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL -- 你设置的级别

 

 

四、MySQL事务ACID

事务的acid特性

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

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

3、隔离性(Isolation):事务的隔离性是多个用户并发访问数据库时,数据库位每一个用户开启的事务,布恩那个被其他事务的操作数据所干扰,多个并发事务事务之间要相互隔离

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

 

 

五、MySQL表类型和存储引擎

基本介绍

1、MySQL的表类型由存储引擎(Storage Engines)决定,主要包括MylSAM、innoDB、Memory等

2、MySQL数据表主要支持六种类型,分别是:CSV、Memory、ARCHIVE、MRG_MYISAM、MYISAM、InnoDB

3、这六种又分两类,一类是“事务安全型”(transaction-safe),比如:InnoDB;其余都属于第二类,称为“非事务安全型”(non-transaction-safe) [mysiam和memory]

 

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

 

细节说明

重点介绍:MyISAM、InnoDB、MEMORY

1、MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整型没有要求

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

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

-- 表类型和存储引擎-- 查看所有的存储引擎
SHOW ENGINES-- innodb 存储引擎,是前面使用过的
-- 1. 支持事务  2. 支持外键  3. 支持行级锁-- myisam 存储引擎
CREATE TABLE t26(id INT,`name` VARCHAR(23) 
)ENGINE MYISAM;
-- 1. 添加速度快  2. 不支持外键  3.支持表级锁START TRANSACTION;
SAVEPOINT t1;
INSERT INTO t26 VALUES(1, 'tom');
SELECT * FROM t26
ROLLBACK TO t1-- memory 存储引擎
-- 1.数据存储在内存中(关闭了mysql服务,数据丢失,但是表结构还在)
-- 2.执行速度很快(没有IO读写)  3.默认支持索引(hash表)CREATE TABLE t27(id INT,`name` VARCHAR(23) 
)ENGINE MEMORY;INSERT INTO t27 VALUES(1, 'tom'), (2, 'jack'), (3, 'hsp')
SELECT * FROM t27
DESC t27-- 修改存储引擎
ALTER TABLE t27 ENGINE = INNODB

 

如何选择表的存储引擎

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

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

3、Memory存储引擎就是将数据存储在内存中,由于没有磁盘I/O的等待,速度极快,但由于是内存存储引擎,所作的任何修改在服务器重启后都将消失(经典用法:用户的在线状态)

 

修改存储引擎

ALTER TABLE 表名 ENGINE = 存储引擎;

 

 

六、视图

基本概念

视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含列,其数据来自对应的真实表(基表)

 

视图的基本使用

1、创建视图:create view 视图名 as select 语句

2、更新成新的视图:alter view 视图名 as select 语句 

3、查看创建视图的指令:show create view 视图名

4、删除视图:drop view 视图名

-- 视图的使用
-- 创建一个视图 emp_view01,只能查询 emp 表的(empno、ename, job 和 deptno ) 信息
-- 创建视图
CREATE VIEW emp_view01AS SELECT empno, ename, job, deptno FROM emp;-- 查看视图
SELECT * FROM emp_view01
SELECT * FROM emp-- 查看创建试图的指令
SHOW CREATE VIEW emp_view01-- 删除视图
DROP VIEW emp_view01

 

视图的使用细节

1、创建视图后,到数据库去看,对应的视图只有一个视图结构文件(形式:视图名.frm)

2、视图的数据变化会影响到基表,基表的数据变化也会影响到视图【insert update delete】

3、视图中可以再使用视图,数据仍然来自基表

-- 视图的细节
-- 1、创建视图后,到数据库去看,对应的视图只有一个视图结构文件(形式:视图名.frm)-- 2、视图的数据变化会影响到基表,基表的数据变化也会影响到视图【insert update delete】
-- 修改视图
UPDATE emp_view01 SET job = 'MANAGER'WHERE empno = 7369
-- 修改基本表,也会影响视图
UPDATE emp SET job = 'SALESMAN'WHERE empno = 7369-- 3、视图中可以再使用视图,数据仍然来自基表
CREATE VIEW emp_view02AS SELECT empno, ename FROM emp_view01;SELECT * FROM emp_view02

 

视图最佳实践

1、安全:一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图,在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不能查看保密的字段。
2、性能:关系数据库的数据常常会分表存储,使用外键建立这些表的之间关系。这时,数据库查询通常会用到连接(JOIN)。这样做不但麻烦,效率相对也比较低。如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用JOIN查询数据。
3、灵活:如果系统中有一张旧的表,这张表由于设计的问题,即将被废弃。然而,很多应用都是基于这张表,不易修改。这时就可以建立一张视图,视图中的数据直接映射到新建的表。这样,就可以少做很多改动,也达到了升级数据表的目的。 

 

 

七、MySQL管理

MySQL用户

MySQL中的用户都存储在系统数据库mysql的user表中

其中user表的重要字段说明:

1、host:允许登录的“位置”,localhost表示该用户只允许本机登录。也可以指定ip地址

2、user:用户名

3、authentication_string:密码,是通过mysql的password()函数加密之后的密码

 

创建用户

CREATE USER '用户名'@'允许登录位置' IDENTIFIED BY '密码'

说明:创建用户,同时指定密码

 

删除用户

DROP USER '用户名'@'允许登录位置'

 

用户修改密码

修改自己的密码

SET PASSWORD = PASSWORD('密码');

修改他人密码(需要有修改用户密码的权限)

SET PASSWORD FOR '用户名'@'登陆位置' = PASSWORD('密码');

 

MySQL中的权限

 

给用户授权

GRANT 权限列表 ON 库.对象名 TO '用户名'@'允许登录位置'【IDENTIFIED BY '密码'】

说明:

1、权限列表,多个权限用逗号隔开。如:grant select detete,insert on .......

2、特别说明:

      *.*:代表本系统中的所有数据库的所有对象(表,视图,存储过程)

      库.*:表示某个数据库中的所有数据对象(表,视图,存储过程等)

3、IDENTIFIED BY 可以省略,也可以写出

      如果用户存在,就是修改该用户的密码

      如果该用户不存在,就是创建该用户

 

回收用户授权

REVOKE 权限列表 ON 库.对象名 FROM '用户名'@'允许登录位置';

-- 演示用户权限的管理
-- 创建用户
CREATE USER 'maomao'@'localhost' IDENTIFIED BY '123';-- 使用root用户创建 testdb,表news
CREATE DATABASE testdb
CREATE TABLE news(id INT,content VARCHAR(32)
);
INSERT INTO news VALUES(100, '北京新闻');-- 给maomao分配查看news表和添加news的权限
GRANT SELECT, INSERTON testdb.newsTO 'maomao'@'localhost';-- 修改maomao的密码为abc
SET PASSWORD FOR 'maomao'@'localhost' = PASSWORD('abc');-- 回收用户maomao在testdb.news的所有权限
REVOKE SELECT, INSERT ON testdb.news FROM 'maomao'@'localhost';
REVOKE ALL ON testdb.news FROM 'maomao'@'localhost';-- 删除maomao
DROP USER 'maomao'@'localhost';

 

权限生效指令

FLUSH PRIVILEGES;

 

细节说明

1、在创建用户的时候,如果不指定Host,则为%,%表示所有IP都有连接权限。create user XXX;

2、也可以这样指定:create user 'xxx'@'192.168.1.%'  表示xxx用户在192.168.1.*的ip可登录mysql

3、在删除用户的时候,如果host不是%,需要明确指定 '用户'@'host值'

-- 说明 用户管理的细节
-- 1、在创建用户的时候,如果不指定Host,则为%,%表示所有IP都有连接权限。create user XXX;
CREATE USER jack-- 2、也可以这样指定:create user 'xxx'@'192.168.1.%'  表示xxx用户在192.168.1.*的ip可登录mysql
CREATE USER 'tom'@'192.168.1.%'-- 3、在删除用户的时候,如果host不是%,需要明确指定 '用户'@'host值'
DROP USER jack -- 默认就是 DROP USER 'jack'@'%'
DROP USER 'tom'@'192.168.1.%'

相关内容

热门资讯

我的未来作文 【实用】我的未来作文7篇  无论在学习、工作或是生活中,大家一定都接触过作文吧,作文是人们把记忆中所...
在未来作文 在未来作文5篇  在日常生活或是工作学习中,许多人都写过作文吧,写作文可以锻炼我们的独处习惯,让自己...
小学三年级童话故事 小学三年级童话故事300字(精选22篇)  故事:在现实认知观的基础上,对其描写成非常态性现象。是文...
被自己感动的作文 被自己感动的作文(精选8篇)  无论是身处学校还是步入社会,大家都尝试过写作文吧,根据写作命题的特点...
小动物观察日记 小动物观察日记(通用21篇)  一天又结束了,一定会有值得记录的想法吧,这也意味着,又要开始写日记了...
岁月如歌作文 岁月如歌作文(精选15篇)  在学习、工作、生活中,许多人都有过写作文的经历,对作文都不陌生吧,根据...
豆芽生长观察日记 豆芽生长观察日记(通用26篇)  时间如快马般匆匆,一天又过去了,相信大家这一天里都收获颇丰吧,需要...
做最好的自己作文 关于做最好的自己作文(5篇)  无论在学习、工作或是生活中,大家最不陌生的就是作文了吧,作文是通过文...
成长的故事作文500字 关于成长的故事作文500字(通用25篇)  无论在学习、工作或是生活中,大家最不陌生的就是作文了吧,...
如何做好自己作文 关于如何做好自己作文  在日常的学习、工作、生活中,大家对作文都再熟悉不过了吧,借助作文人们可以实现...
期中考试后感受作文 期中考试后感受作文6篇  在日常学习、工作和生活中,大家都不可避免地会接触到作文吧,作文根据写作时限...
兔子尾巴童话作文 兔子尾巴童话作文  在平凡的学习、工作、生活中,大家一定都接触过作文吧,作文是通过文字来表达一个主题...
绿豆观察日记作文 关于绿豆观察日记作文(精选22篇)  在日常生活或是工作学习中,大家或多或少都会接触过作文吧,作文根...
风景优美的地方作文 关于风景优美的地方作文汇总9篇  无论是在学校还是在社会中,大家都尝试过写作文吧,借助作文人们可以反...
经过的每一天散文 经过的每一天散文(通用24篇)  在日常的学习、工作、生活中,说起散文,大家肯定都不陌生吧?散文是一...
未来的我作文 未来的我作文(精选40篇)  在学习、工作、生活中,大家一定都接触过作文吧,写作文可以锻炼我们的独处...
一件让我感动的事作文 一件让我感动的事作文(精选100篇)  在现实生活或工作学习中,大家或多或少都会接触过作文吧,作文可...
中国的世界文化遗产作文 中国的世界文化遗产作文(精选52篇)  在日常的学习、工作、生活中,大家都尝试过写作文吧,借助作文可...
美人鱼的传说童话作文 美人鱼的传说童话作文  其实美人鱼有一个传说,他曾经被巫婆失过魔法,她一直在寻找着自己的白马王子。 ...
冰心散文集读后感作文900字 冰心散文集读后感作文900字  读一本好书,能使人品味许久;悟一个道理,则使人受益终身。读了《冰心散...