1. 程式人生 > >詳解Mysql事務、索引、視圖

詳解Mysql事務、索引、視圖

詳細信息 fad mysql 出現一次 text esc 這一 虛擬 內存

索引簡介

索引是為了加速對表中數據行的檢索而創建的一種分散的存儲結構。索引是針對表而建立的,它是由數據頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指針,以便加速檢索物理數據。

索引作用

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;

詳解Mysql事務、索引、視圖