MySQL索引、事務以及儲存引擎的相關知識和命令

zjytobe發表於2020-11-04

一、索引的概念

資料庫索引是一個排序的列表,儲存著索引值和這個值所對應的實體地址,相當於一本書的目錄
它無須對整個表進行掃描,通過實體地址就可以找到所需資料
是表中一列或者若干列值排序的方法
資料庫索引需要額外的磁碟空間

二、索引的作用

資料庫利用各種快速定位技術,能夠大大加快查詢速率
當表很大或查詢涉及到多個表時,可以成千上萬倍地提高查詢速度
可以降低資料庫的IO成本,並且還可以降低資料庫的排序成本
通過建立唯一性索引保證資料表資料的唯一性
可以加快表與表之間的連線
在使用分組和排序時,可大大減少分組和排序時間

三、char和varchar的區別

1、char的長度是不變的,而varchar的長度是可變的

欄位b:型別char(10),          值為:abc,儲存為:abc
欄位d:型別varchar(10),       值為:abc,儲存為:abc    (abc+7個空格)        

2、超出長度自動擷取

欄位c:型別char(3),              值為:abcdefg, 儲存為:abc(defg自動刪除)
欄位e:型別varchar(3),           值為:abcdefg, 儲存為:abc(defg自動刪除)

3、varchar(10)和char(10),都表示存10個字元,無論存放的是數字、字母還是UTF8漢字(每個漢字3位元組),都可以存放10個

4、char最多可以存放255個字元,varchar的最大長度為65535個位元組,varchar可存放的字元數跟編碼有關
字元型別若為gbk,每個字元最多佔2個位元組,最大長度不能超過32766個字元
字元型別若為utf8,每個字元最多佔3個位元組,最大長度不能超過21845個字元
注:
UTF-8:一個漢字=3個位元組
GBK:一個漢字=2個位元組

5、char和varchar的最大長度限制是mysql規定的

四、索引的分類

1、普通索引

最基本的索引,沒有唯一性之類的限制

建立普通索引的方式:

①建立表結構時建立

mysql> create table user(id int(4) NOT NULL,name char(48) NOT NULL,age int(3) NOT NULL,sex varchar(36) NOT NULL,primary key (name),index index_id (id));       #建立表時建立索引
mysql> show index from user;       #檢視索引

②直接建立索引

mysql> create index index_name on user(name);
mysql> show index from user;            

③修改表結構方式新增索引

mysql> alter table user add index index_age(age);
mysql> show index from user;
2、唯一性索引

與“普通索引”基本相同
普通索引的區別是索引列的所有值只能出現一次,即必須唯一

建立唯一索引的方式

①直接建立索引

mysql> insert into user(id,name,age,sex) values(1,'liming',18,'男'),(2,'lisi',25,'男'),(3,'lili',20,'女');
mysql> create unique index index_name on user(name);
mysql> show index from user;

②修改表結構方式新增索引

mysql> alter table user add unique index_name(name);
mysql> show index from user;
3、主鍵索引

是一種特殊的唯一索引,指定為“PRIMARY KEY”
一個表只能有一個主鍵,不允許有空值

建立主鍵索引的方式

mysql> create table user(id int(4) NOT NULL,name char(48) NOT NULL,age int(3) NOT NULL,sex varchar(36) NOT NULL,primary key (name);
4、檢視索引
mysql> show index from 表名;
mysql> show keys from 表名;
5、刪除索引
mysql> drop index 索引名 on 表名;
mysql> alter table index 表名 drop index 索引名;
6、組合索引

可以是單列上建立的索引,也可以是在多列上建立的索引
最左原則,從左往右依次執行

建立組合索引的方式

mysql> create table users(name varchar(9), age int(3),sex tinyint(1),indexx users(name,age,sex));
mysql> show index from users;
7、全文索引

MySQL從3.23.23版開始支援全文索引和全文檢索
索引型別為FULLTEXT
可以在CHAR、VARCHAR或者TEXT型別的列上建立

建立全文索引的方式
①直接建立索引

mysql> create index index_id on user(id);
mysql> show index from user;

②修改表結構方式新增索引

mysql> alter table user add index index_age(age);
mysql> show index from user;
8、擴充套件

兩張表之間建立內聯

mysql> create table user1(id int(10) not null auto_increment,name varchar(64) not null,score int(3) not null,hobby int(2),primary key(id));
mysql> insert into user1(id,name,score,hobby) values(1,'zhaosi',66,2),(2,'liming',77,3),(3,'lihao',88,1);
mysql> select * from user1;
mysql> create table hob(id int(2) primary key,hob_name varchar(40) not null);
mysql> insert into hob(id,hob_name) values(1,'看書'),(2,'聊天'),(3,'美術');
mysql> select * from hob;
mysql> select * from user1 inner join hob on user1.hobby=hob.id;
mysql> select user1.name,hob.hob_name from user1 inner join hob on user1.hobby=hob.id;
mysql> select u.name,h.hob_name from user1 u inner join hob h on u.hobby=h.id;  

建立索引試圖,相當於Linux中的軟連結

mysql> create view view_user as select u.name,h.hob_name from user1 u inner join hob h on u.hobby=h.id;        #建立試圖,view_user是檢視名
mysql> select * from view_user;
mysql> insert into user1(id,name,score,hobby) values(4,'wangwu',69,2);       #後續新增的內容會顯示在試圖中
mysql> select * from view_user;

五、建立索引的原則依據

表的主鍵、外來鍵必須有索引
記錄數超過300行的表應該有索引
經常與其他表進行連線的表,在連線欄位上應該建立索引
唯一性太差的欄位不適合建立索引
更新太頻繁的欄位不適合建立索引
經常出現在where子句中的欄位,特別是大表的欄位,應該建立索引
索引應該建立在選擇性高的欄位上
索引應該建立在小欄位上,對於大的文字欄位甚至超長欄位,不要建立索引

六、事務的概念

是一種機制、一個操作序列,包含了一組資料庫操作命令,並且把所有的命令作為一個整體一起向系統提交或撤銷操作請求,即這一組資料庫命令要麼都執行,要麼都不執行
是一個不可分隔的工作邏輯單元,在資料庫系統上執行併發操作時,事務時最小的控制單元
適用於多使用者同時操作的資料庫系統的場景,如銀行、保險公司及證券交易系統等等
通過事務的整體性以保證資料的一致性
事務的特點:

1、原子性

事務是一個完整的操作,事務的個元素是不可分的
事務中的所有元素必須作為一個整體提交或回滾
如果事務中的任何元素失敗,則整個事務將失敗

2、一致性

當事務完成時,資料必須處於一致狀態
在事務開始前,資料庫中儲存的資料處於一致狀態
在正在進行的事務中,資料可能處於不一致的狀態
當事務成功完成時,資料必須再次回到已知的一致狀態

3、隔離性

對資料進行修改的所有併發事務是彼此隔離的,表明事務必須是獨立的,它不應以任何方式依賴於或影響其他事務
修改資料的事務可在另一個使用相同資料的事務開始之前訪問這些資料,或者在另一個使用相同資料的事務結束之後訪問這些資料

4、永續性

指不管系統是否發生故障,事務處理的結果都是永久的

一旦事務被提交,事務的效果會被永久地保留在資料庫中
事務控制語句

MySQL事務預設是自動提交的,當SQL語句提交時事務便自動提交

BEGIN或START TRANSACTION
COMMIT
ROLLBACK
SAVEPOINT identifier
RELEASE SAVEPOINT identifier
ROLLBACK TO identifier
SET TRANSACTION

事務的控制方法

1、 事務處理命令控制事務

BEGIN:開始一個事務
COMMIT:提交一個事務
ROLLBACK:回滾一個事務

2、使用set命令進行控制

set autocommit=0:禁止自動提交
set autocommit=1:開啟自動提交
事務的操作
mysql> begin;         #開始事務
mysql> insert into userq1(id,name,score,hobby) values(5,'yy',80,2);
mysql> rollback;      #回滾
mysql> commit;        #提交

七、儲存引擎概念介紹

MySQL中的資料用各種不同的技術儲存檔案中,每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並最終提供不同的功能和能力,這些不同的技術以及配套的功能在MySQL中稱為儲存引擎
儲存引擎時MySQL將資料儲存在檔案系統中的儲存方式或者儲存格式

MySQL常用的儲存引擎
MyISAM
InnoDB

MySQL資料庫中的元件,負責執行實際的資料I/O操作
MySQL系統中,儲存引擎處於檔案系統之上,在資料儲存到資料檔案之前會傳輸到儲存引擎,之後按照各個儲存引擎的儲存格式進行儲存

八、MyISAM的介紹

MyISAM不支援事務,也不支援外來鍵 ,MySAM訪問速度快 ,對事務完整性沒有要求

MyISAM在磁碟上儲存成三個檔案

frm檔案儲存表定義
資料檔案的副檔名為.MYD(MYDATA)
索引檔案的副檔名是.MYI(MYIndex)

表級鎖定形式,資料在更新時鎖定整個表
資料庫在讀寫過程中相互阻塞
會在資料寫入的過程阻塞使用者資料的讀取
也會在資料讀取的過程中阻塞使用者的資料寫入
資料單獨寫入或讀取,速度過程較快且佔用資源相對少

MyISAM支援的儲存格式
靜態表 
動態表   
壓縮表
MyISAM適用的生產場景舉例
公司業務不需要事務的支援
單方面讀取或寫入資料比較多的業務
MyISAM儲存引擎資料讀寫都比較頻繁場景不適合
使用讀寫併發訪問相對較低的業務
資料修改相對較少的業務
對資料業務一致性要求不是非常高的業務
伺服器硬體資源相對比較差

InnoDB的介紹

1、InnoDB特點介紹
支援4個事務隔離級別
行級鎖定,但是全表掃描仍然會是表級鎖定
讀寫阻塞與事務隔離級別相關
能非常高效的快取索引和資料
表與主鍵以簇的方式儲存
支援分割槽、表空間、類似Oracle資料庫
支援外來鍵約束,5.5前不支援全文索引,5.5後支援全文索引
對硬體資源要求還是比較高的場合
2、InnoDB適用生產場景分析
業務需要事務的支援

行級鎖定對高併發有很好的適用能力,但需要確保查詢是通過索引來完成

業務資料更新較為頻繁的場景,如:論壇,微博等

業務資料一致性要求較高,如:銀行業務

硬體裝置記憶體較大,利用InnoDB較好的快取能力來提高記憶體利用率,減少磁碟IO的壓力
3、企業選擇儲存引擎依據

3.1、需要考慮每個儲存引擎提供的核心功能及應用場景

3.2、支援的欄位和資料型別

①所有引擎都支援通用的資料型別

②但不是所有的引擎都支援其它的欄位型別,如二進位制物件

3.3、鎖定型別:不同的儲存引擎支援不同級別的鎖定

①表鎖定
②行鎖定

3.4、索引的支援

建立索引在搜尋和恢復資料庫中的資料時能顯著提高效能
不同的儲存引擎提供不同的製作索引的技術
有些儲存引擎根本不支援索引

3.5、事務處理的支援

提高在向表中更新和插入資訊期間的可靠性
可根據企業業務是否要支援事務選擇儲存引擎
4、修改儲存引擎
方法一:alter table修改
mysql> alter table 庫名 engine=MyISAM;
方法二:修改my.cnf配置檔案,指定預設儲存引擎並重啟服務
vim my.cnf
default-storage-engine=InnoDB
方法三:create table建立表時指定儲存引擎
mysql> create table engine Test(id int) engine=MyISAM;

相關文章