详解Mysql事务、索引、视图

索引简介

索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。

索引作用

1、设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率
2、特别是当表很大时,或者查询设计到多表时,使用索引可使查询加快千倍
3、可以降低数据库的IO(输入输出)成本,并且索引还可以降低数据库的排序成本,注意读的时候会消耗内存
4、通过创建唯一性索引保证数据表数据的唯一性
5、可以加快表与表之间的连接,注意可以把相关的字段当做一个索引
6、在使用分组的排序时,可大大减少分组和排序时间

索引的分类

普通索引

这是最基本的索引类型,而且它没有唯一性之类的限制
唯一性索引
这种索引和前面"普通索引"基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一,允许为空,只能有一个值为空

主键索引

这是一种唯一性索引,但它必须指定为"PRIMARY KEY"

全文索引

MySQL3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT,全文索引可以再VARCHAR或者TEXT类型的列上创建

单列索引与多列索引

索引可以是单列上创建的索引,也可以是在多列上创建的索引

事务简介

事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行。事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元,适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等,通过事务的整体性以保证数据的一致性。

事务特点

1、原子性
事务是一个完整的操作,事物的各元素是不可分的,事务中的所有元素必须作为一个整体提交或回滚,如果事务中的任何元素失败,则整个事务将失败
2、一致性
当事务完成时,数据必须处于一致状态:在事务开始之前,数据库中存储的数据处于一致状态;在正在进行的事务中,数据可能处于不一致的状态;当事务成功完成时,数据必须再次回到已知的一致性,注意是前后结果保持一致。
3、隔离性
对数据进行修改的所有并发事务时彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据,注意事务之间彼此隔离
4、持久性
事务的持久性不管系统是否发生了故障,事务处理的结果都是永久的,一旦事务被提交,事务的效果会被永久地保留在数据库中,也就是写入系统磁盘中

视图简介

视图是数据库中的一张虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。可以理解为软链接

视图作用

1、为用户集中数据,简化用户的数据查询和处理。
2、屏蔽数据库的复杂性,用户不必了解数据库的复杂性。
3、简化用户权限的管理,只授予用户使用视图的权限。
4、便于数据共享,多个用户不必都定义所需的数据。
5、可以重新组织数据,以便关联到其他应用中。

命令步骤

一、索引

1、普通索引

mysql> create table student
(id int(3),
name varchar(10), #姓名
score decimal(5,2), #分数
adrress varchar(50), #地址
hobbyid int(3) #关联hobby(兴趣爱好表)
); #创建一张student表

mysql> create index id_index on student(id); #将student表中id字段创建成普通索引

mysql> show index from student\G; #查看索引
详解Mysql事务、索引、视图

mysql> drop index id_index on student; #删除索引

2、主键索引

mysql> alter table student add primary key(id); #使用alter命令修改表结构,将id更改为主键
mysql> show index from student\G; #查看索引
详解Mysql事务、索引、视图

mysql> alter table student drop primary key; #删除student表主键

mysql> create table info(id int not null primary key auto_increment,name varchar(10)); #通过创建表的时候创建主键列对应的也是主键索引

mysql> show index from info\G;
详解Mysql事务、索引、视图

mysql> alter table info drop primary key; #删除student表主键

mysql> drop table info; #删除info表

3、唯一索引

mysql> create unique index name_index on student(name); #将student表中name字段创建成唯一索引
mysql> show index from student\G;
详解Mysql事务、索引、视图

mysql> drop index name_index on student; ##删除唯一索引

mysql> create table info(id int not null,name varchar(10) unique); #通过创建表的时候创建唯一键对应的也是唯一索引

mysql> show index from info\G;
详解Mysql事务、索引、视图

mysql> alter table info drop index name; #删除索引

mysql> show index from info\G; #删除info表

4、全文索引

mysql> alter table student add column descript TEXT; #向student表中添加descript字段,类型为TEXT
mysql> desc student;
详解Mysql事务、索引、视图

mysql> alter table student add FULLTEXT index desc_index(descript);#将student表中descript字段创建成全文索引
mysql> show index from student\G;
详解Mysql事务、索引、视图

mysql> drop index desc_index on student; #删除student表全文索引

mysql> create table info(descript text,FULLTEXT(descript));#通过创建表的时候创建全文索引

详解Mysql事务、索引、视图

mysql> alter table info drop index descript; #删除info表全文索引

mysql> drop table info; #删除info表

5、单列索引、多列索引

关于单列索引,以上例子都是单列索引,略……
mysql> create index duo_index on student(id,hobbyid); #将student表中id、hobbyid两字段创建成多列索引
详解Mysql事务、索引、视图

mysql> drop index duo_index on student; #删除student表多列索引

mysql> create table info(id int,name varchar(10),index duo_index(id,name));#通过创建表的时候将id,name字段设置为多列索引

mysql> show index from info\G;
详解Mysql事务、索引、视图

mysql> drop index duo_index on student; #删除student表多列索引

mysql> drop index duo_index on info; #删除多列索引

mysql> drop table info; #删除info表

二、事务

1、提交事务

mysql> select * from student;
详解Mysql事务、索引、视图

mysql> begin; #开启事务
mysql> insert into student values(1,'zhangsan',50,'gz',1,'good');
mysql> insert into student values(2,'lisi',40,'zz',1,'good');
mysql> insert into student values(3,'wangwu',40,'zz',1,'good');
mysql> commit; #提交事务

mysql> select * from student;

详解Mysql事务、索引、视图

2、回滚事务

mysql> begin;
mysql> insert into student values(4,'zhaoliu',50,'gz',1,'good');
mysql> insert into student values(5,'tianqi',50,'gz',1,'good');
mysql> insert into student values(6,'qianba',50,'gz',1,'good');
mysql> rollback; #回滚事务

mysql> select * from student;
详解Mysql事务、索引、视图

3、指定回滚点

mysql> begin;
mysql> insert into student values(4,'t01',30,'gz',1,'good');
mysql> savepoint s1;
mysql> insert into student values(5,'t02',20,'gz',1,'good');
mysql> savepoint s2;
mysql> insert into student values(6,'t03',50,'gz',1,'good');
mysql> savepoint s3;
mysql> rollback to savepoint s2; #将事务回滚至s2标记下
mysql> commit; #提交

mysql> select * from student;
详解Mysql事务、索引、视图

三、视图

1、创建视图

mysql> create view stu_view as select * from student where score > 30;

2、查看视图详细信息

mysql> show create view stu_view\G;
详解Mysql事务、索引、视图

3、查看视图数据信息

mysql> select * from stu_view;
详解Mysql事务、索引、视图

4、修改视图

mysql> alter view stu_view as select from student where score > 40;
mysql> select
from stu_view;
详解Mysql事务、索引、视图

5、修改数据

mysql> update stu_view set score=100 where id=1; #修改视图,score为100
mysql> select * from stu_view;
详解Mysql事务、索引、视图

mysql> select * from student;
详解Mysql事务、索引、视图

6、删除视图

mysql> drop view stu_view;

猜你喜欢

转载自blog.51cto.com/11905606/2166235