1. 程式人生 > 實用技巧 >mysql索引、事務與儲存引擎知識以及使用命令(實戰)

mysql索引、事務與儲存引擎知識以及使用命令(實戰)

mysql索引、事務與儲存引擎知識以及使用命令(實戰)

  • 一、索引的概念
  • 二、索引的作用
  • 三、char和varchar的區別
  • 四、索引的分類
    • 4.1、普通索引
    • 4.2、唯一性索引
    • 4.3、主鍵索引
    • 4.4、檢視索引
    • 4.5、刪除索引
    • 4.6、組合索引
    • 4.7、全文索引
    • 4.8、擴充套件
  • 五、建立索引的原則依據
  • 六、事務的概念
  • 七、儲存引擎概念介紹
  • 八、MyISAM的介紹
  • 九、InnoDB的介紹

一、索引的概念

1.1、資料庫索引

1.1.1、是一個排序的列表,儲存著索引值和這個值所對應的實體地址,相當於一本書的目錄

1.1.2、無須對整個表進行掃描,通過實體地址就可以找到所需資料

1.1.3、是表中一列或者若干列值排序的方法

1.1.4、需要額外的磁碟空間

二、索引的作用

2.1、資料庫利用各種快速定位技術,能夠大大加快查詢速率

2.2、當表很大或查詢涉及到多個表時,可以成千上萬倍地提高查詢速度

2.3、可以降低資料庫的IO成本,並且還可以降低資料庫的排序成本

2.4、通過建立唯一性索引保證資料表資料的唯一性

2.5、可以加快表與表之間的連線

2.6、在使用分組和排序時,可大大減少分組和排序時間

三、char和varchar的區別

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

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

3.2、超出長度自動擷取

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

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

3.4、char最多可以存放255個字元,varchar的最大長度為65535個位元組,varchar可存放的字元數跟編碼有關

1 字元型別若為gbk,每個字元最多佔2個位元組,最大長度不能超過32766個字元
2 字元型別若為utf8,每個字元最多佔3個位元組,最大長度不能超過21845個字元
3 注:
4 UTF-8:一個漢字=3個位元組
5 GBK:一個漢字=2個位元組

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

四、索引的分類

4.1、普通索引

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

4.1.2、建立普通索引的方式

①建立表結構時建立

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));       #建立表時建立索引
2 mysql> show index from user;       #檢視索引

②直接建立索引

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

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

1 mysql> alter table user add index index_age(age);
2 mysql> show index from user;

4.2 唯一性索引

4.2.1、與“普通索引”基本相同

4.2.2、與普通索引的區別是索引列的所有值只能出現一次,即必須唯一

4.2.3、建立唯一索引的方式

①直接建立索引

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

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

1 mysql> alter table user add unique index_name(name);
2 mysql> show index from user;

4.3、主鍵索引

4.3.1、是一種特殊的唯一索引,指定為“PRIMARY KEY”

4.3.2、一個表只能有一個主鍵,不允許有空值

4.3.3、建立主鍵索引的方式

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

4.4、檢視索引

1 mysql> show index from 表名;
2 mysql> show keys from 表名;

4.5、刪除索引

1 mysql> drop index 索引名 on 表名;
2 mysql> alter table index 表名 drop index 索引名;

4.6、組合索引

4.6.1、可以是單列上建立的索引,也可以是在多列上建立的索引

4.6.2、最左原則,從左往右依次執行

4.6.3、建立組合索引的方式

1 mysql> create table users(name varchar(9), age int(3),sex tinyint(1),indexx users(name,age,sex));
2 mysql> show index from users;

4.7、全文索引

4.7.1、MySQL從3.23.23版開始支援全文索引和全文檢索

4.7.2、索引型別為FULLTEXT

4.7.3、可以在CHAR、VARCHAR或者TEXT型別的列上建立

①直接建立索引

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

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

1 mysql> alter table user add index index_age(age);
2 mysql> show index from user;

4.8、擴充套件

4.8.1、兩張表之間建立內聯

1 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));
2 mysql> insert into user1(id,name,score,hobby) values(1,'zhaosi',66,2),(2,'liming',77,3),(3,'lihao',88,1);
3 mysql> select * from user1;
4 mysql> create table hob(id int(2) primary key,hob_name varchar(40) not null);
5 mysql> insert into hob(id,hob_name) values(1,'看書'),(2,'聊天'),(3,'美術');
6 mysql> select * from hob;
7 mysql> select * from user1 inner join hob on user1.hobby=hob.id;
8 mysql> select user1.name,hob.hob_name from user1 inner join hob on user1.hobby=hob.id;
9 mysql> select u.name,h.hob_name from user1 u inner join hob h on u.hobby=h.id;  

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

1 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是檢視名
2 mysql> select * from view_user;
3 mysql> insert into user1(id,name,score,hobby) values(4,'wangwu',69,2);       #後續新增的內容會顯示在試圖中
4 mysql> select * from view_user;

五、建立索引的原則依據

5.1、表的主鍵、外來鍵必須有索引

5.2、記錄數超過300行的表應該有索引

5.3、經常與其他表進行連線的表,在連線欄位上應該建立索引

5.4、唯一性太差的欄位不適合建立索引

5.5、更新太頻繁的欄位不適合建立索引

5.6、經常出現在where子句中的欄位,特別是大表的欄位,應該建立索引

5.7、索引應該建立在選擇性高的欄位上

5.8、索引應該建立在小欄位上,對於大的文字欄位甚至超長欄位,不要建立索引

六、事務的概念

6.1、是一種機制、一個操作序列,包含了一組資料庫操作命令,並且把所有的命令作為一個整體一起向系統提交或撤銷操作請求,即這一組資料庫命令要麼都執行,要麼都不執行

6.2、是一個不可分隔的工作邏輯單元,在資料庫系統上執行併發操作時,事務時最小的控制單元

6.3、適用於多使用者同時操作的資料庫系統的場景,如銀行、保險公司及證券交易系統等等

6.4、通過事務的整體性以保證資料的一致性

6.5、事務的特點:

6.5.1、原子性

①事務是一個完整的操作,事務的個元素是不可分的

②事務中的所有元素必須作為一個整體提交或回滾

③如果事務中的任何元素失敗,則整個事務將失敗

6.5.2、一致性

①當事務完成時,資料必須處於一致狀態

②在事務開始前,資料庫中儲存的資料處於一致狀態

③在正在進行的事務中,資料可能處於不一致的狀態

④當事務成功完成時,資料必須再次回到已知的一致狀態

6.5.3、隔離性

①對資料進行修改的所有併發事務是彼此隔離的,表明事務必須是獨立的,它不應以任何方式依賴於或影響其他事務

②修改資料的事務可在另一個使用相同資料的事務開始之前訪問這些資料,或者在另一個使用相同資料的事務結束之後訪問這些資料

6.5.4、永續性

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

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

6.6、事務控制語句

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

6.6.2、事務控制語句

1 BEGIN或START TRANSACTION
2 COMMIT
3 ROLLBACK
4 SAVEPOINT identifier
5 RELEASE SAVEPOINT identifier
6 ROLLBACK TO identifier
7 SET TRANSACTION

6.7、事務的控制方法

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

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

6.7.2、使用set命令進行控制

1 set autocommit=0:禁止自動提交
2 set autocommit=1:開啟自動提交

6.8、事務的操作

1 mysql> begin;         #開始事務
2 mysql> insert into userq1(id,name,score,hobby) values(5,'yy',80,2);
3 mysql> rollback;      #回滾
4 mysql> commit;        #提交

七、儲存引擎概念介紹

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

7.2、儲存引擎時MySQL將資料儲存在檔案系統中的儲存方式或者儲存格式

7.3、MySQL常用的儲存引擎

1 MyISAM
2 InnoDB

7.4、MySQL資料庫中的元件,負責執行實際的資料I/O操作

7.5、MySQL系統中,儲存引擎處於檔案系統之上,在資料儲存到資料檔案之前會傳輸到儲存引擎,之後按照各個儲存引擎的儲存格式進行儲存

八、MyISAM的介紹

8.1、MyISAM不支援事務,也不支援外來鍵

8.2、訪問速度快

8.3、對事務完整性沒有要求

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

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

8.5、表級鎖定形式,資料在更新時鎖定整個表

8.6、資料庫在讀寫過程中相互阻塞

8.6.1、會在資料寫入的過程阻塞使用者資料的讀取

8.6.2、也會在資料讀取的過程中阻塞使用者的資料寫入

8.7、資料單獨寫入或讀取,速度過程較快且佔用資源相對少

8.8、MyISAM支援的儲存格式

8.8.1、靜態表

8.8.2、動態表

8.8.3、壓縮表

8.9、MyISAM適用的生產場景舉例

8.9.1、公司業務不需要事務的支援

8.9.2、單方面讀取或寫入資料比較多的業務

8.9.3、MyISAM儲存引擎資料讀寫都比較頻繁場景不適合

8.9.4、使用讀寫併發訪問相對較低的業務

8.9.5、資料修改相對較少的業務

8.9.6、對資料業務一致性要求不是非常高的業務

8.9.7、伺服器硬體資源相對比較差

九、InnoDB的介紹

9.1、InnoDB特點介紹

9.1.1、支援4個事務隔離級別

9.1.2、行級鎖定,但是全表掃描仍然會是表級鎖定

9.1.3、讀寫阻塞與事務隔離級別相關

9.1.4、能非常高效的快取索引和資料

9.1.5、表與主鍵以簇的方式儲存

9.1.6、支援分割槽、表空間、類似Oracle資料庫

9.1.7、支援外來鍵約束,5.5前不支援全文索引,5.5後支援全文索引

9.1.8、對硬體資源要求還是比較高的場合

9.2、InnoDB適用生產場景分析

9.2.1、業務需要事務的支援

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

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

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

9.2.5、硬體裝置記憶體較大,利用InnoDB較好的快取能力來提高記憶體利用率,減少磁碟IO的壓力

9.3、企業選擇儲存引擎依據

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

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

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

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

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

①表鎖定

②行鎖定

9.3.4、索引的支援

①建立索引在搜尋和恢復資料庫中的資料時能顯著提高效能

②不同的儲存引擎提供不同的製作索引的技術

③有些儲存引擎根本不支援索引

9.3.5、事務處理的支援

①提高在向表中更新和插入資訊期間的可靠性

②可根據企業業務是否要支援事務選擇儲存引擎

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