详解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> drop index id_index on student; #删除索引

2、主键索引

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

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> 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> 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> 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> alter table student add FULLTEXT index desc_index(descript);#将student表中descript字段创建成全文索引
mysql> show index from student\G;

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

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

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

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;

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;

三、视图

1、创建视图

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

2、查看视图详细信息

mysql> show create view stu_view\G;

3、查看视图数据信息

mysql> select * from stu_view;

4、修改视图

mysql> alter view stu_view as select from student where score > 40;
mysql> select
from stu_view;

5、修改数据

mysql> update stu_view set score=100 where id=1; #修改视图,score为100
mysql> select * from stu_view;

mysql> select * from student;

6、删除视图

mysql> drop view stu_view;

原文地址:http://blog.51cto.com/11905606/2166235

时间: 2024-10-11 13:34:34

详解Mysql事务、索引、视图的相关文章

详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)

详解 MySql InnoDB 中的三种行锁(记录锁.间隙锁与临键锁) 前言 InnoDB 通过 MVCC 和 NEXT-KEY Locks,解决了在可重复读的事务隔离级别下出现幻读的问题.MVCC 我先挖个坑,日后再细讲,这篇文章我们主要来谈谈那些可爱的锁. 什么是幻读? 幻读是在可重复读的事务隔离级别下会出现的一种问题,简单来说,可重复读保证了当前事务不会读取到其他事务已提交的 UPDATE 操作.但同时,也会导致当前事务无法感知到来自其他事务中的 INSERT 或 DELETE 操作,这就

Mysql常用show命令,show variables like xxx 详解,mysql运行时参数

MySQL中有很多的基本命令,show命令也是其中之一,在很多使用者中对show命令的使用还容易产生混淆,本文汇集了show命令的众多用法. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 a. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称. b. show databases; -- 显示mysql中所有数据库的名称. c. show columns from table_n

详解mysql复制机制--异步复制,半同步复制和并行复制

详解MySQL复制机制--异步复制,半同步复制和并行复制 **# 异步复制 异步复制是MySQL自带的最原始的复制方式,主库和备库成功建立复制关系后,在备库上会有一个IO线程去主库拉取binlog,并将binlogx到本地,就是下图中Relaylog,然后备库会开启另外一个SQL线程取回放Relay log,通过这种方式达到Master-Slave数据同步的目的. 通常情况下,slave是只读的,可以承担一部分读流量,而且可以根据实际需要,添加一个或者多个slave,这样在一定程度上可以缓解主库

MySQL存储过程详解 mysql 存储过程

MySQL存储过程详解  mysql 存储过程 (2010-12-13 10:59:38) 转载▼ 标签: it 分类: mysql mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它. 一个存储过程是一个可编程的函数,它在数据库中创建并保

详解mysql中的Using与On的用法

多用才可以体会各个关键字的用法啊... 原文来自[http://bbs.php100.com/read-htm-tid-148469.html] 在用Join进行多表联合查询时,我们通常使用On来建立两个表的关系.其实还有一个更方便的关键字,那就是Using.那么这两个关键字在使用上有啥区别呢?往下看.假设有如下两张表:    mysql> select * from pets; +---------+---------+--------+-----------+ | pets_id | ani

onLayout源码 流程 思路详解(ANDROID自定义视图)

简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3.绘制--onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 第一步的测量,可以参考我之前的文章:(ANDROID自定义视图--onMeasure流程,MeasureSpec详解) 而这篇文章就来谈谈第二步:"

【文章阅读】详解MySQL数据类型

详解MySQL数据类型 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/p/8446246.html 注:对于MySQL的数据类型做了详细的讲解,这是我看过的最全面最有深度的文章. 原文地址:https://www.cnblogs.com/buwuliao/p/8810060.html

详解MySQL中EXPLAIN解释命令

Explain 结果解读与实践 基于 MySQL 5.0.67 ,存储引擎 MyISAM . 注:单独一行的"%%"及"`"表示分隔内容,就象分开“第一章”“第二章”. explain 可以分析 select 语句的执行,即 MySQL 的“执行计划”: mysql> explain select 1; +----+-------------+-------+------+---------------+------+---------+------+----

详解MySQL大表优化方案

当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的.而事实上很多时候MySQL单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量: 字段 尽量使用TINYINT.SMALLINT.MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED VARCHAR的