文章目錄
前言:
之前的博客中介紹了mysql數據庫的管理和SQL語句的基本運用,本篇博客將在此基礎上介紹索引、事務、視圖、存儲過程和存儲引擎(Mylsam,innodb)
一、索引
1.1 索引基本概念
-
數據庫中的索引與書籍中的目錄類似
在一本書中,無須閱讀整本書,利用目錄就可以快速査找所需信息
書中的目錄是一個詞語列表,其中註明了包含各個詞的頁碼
-
數據庫索引
在數據庫中,索引使數據庫程序無須對整個表進行掃描,就可以在其中找到所需數據
數據庫中的索引是某個表中一列或者若干列值的集合,以及物理標識這些值的數據頁的邏輯指針清單
1.2 索引的作用
-
設置了合適的索引之後,數據庫利用各種快速的定位技術,能夠大大加快查詢速率
-
特別是當表很大時,或者查詢涉及到多個表時,使用索引可使查詢加快成幹倍
-
可以降低數據庫的IO成本,並且索引還可以降低數據庫的排序成本
-
通過創建唯一性索引保證數據表數據的唯一性
-
可以加快表與表之間的連接
-
在使用分組和排序時,可大大減少分組和排序時間
1.3 索引的優缺點
-
索引的優點
① 大大加快數據的檢索速度
② 創建唯一性索引,保證數據庫表中每一行數據的唯一性
③ 加速表和表之間的連接
④ 在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間
-
索引的缺點
① 索引需要佔物理空間
② 當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度
1.4 索引的分類
-
普通索引
這是最基本的索引類型,而且它沒有唯一性之類的限制
-
唯一性索引
這種索引和前面的“普通索引”基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一
唯一索引允許爲空,但僅允許爲空一次,
-
主鍵
主鍵是一種唯一性索引,但它必須指定爲“ PRIMARY KEY
主鍵索引具備唯一索引除允許爲空外的特性
-
全文索引
MySQL從32323版開始支持全文索引和全文檢索。在 MySQL中全文索引的索引類型爲 FULLTEXT,全文索引可以在 ARCHAR或者TEXT類型的列上創建。
如果非要爲
-
單列索引與多列索引
索引可以是單列上創建的索引,也可以是在多列上創建的索引
一般通過多列索引可以確保定位到某個實體
1.5 創建索引的原則依據
-
表的主鍵、外鍵必須有索引 (外鍵允許重複,主鍵不允許⭐)
-
數據量超過300行的表應該有索引
-
經常與其他表進行連接的表,在連接字段上應該建立索引
-
唯一性太差的字段不適合建立索引
-
更新太頻繁地字段不適合創建索引
-
經常出現在 Where子句中的字段,特別是大表的字段,應該建立索
引
-
索引應該建在選擇性高的字段上
-
索引應該建在小字段上,對於大的文本字段甚至超長字段,不要建索引
如果必須需要建立索引,則建立full tex (全文索引)
1.6 創建索引
根據企業需求選擇了合適的索引之後,可使用create index創建索引
create index 加上各個索引關鍵字便可以創建各個類型的索引
示例:
① 先創建一個數據庫和一個數據表,之後的索引在此基礎上進行
mysql> create database school;
Query OK, 1 row affected (0.01 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql> use school;
Database changed
mysql> create table info ( ind int(4) not null primary key auto_increment, name varchar(10) not null, address varchar(50) default 'nj', age int(3) not null);
Query OK, 0 rows affected (0.04 sec)
#auto_increment 自動增長
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| info |
+------------------+
1 row in set (0.00 sec)
② 向表中創建內容
mysql> insert into info(name,address,age) values ('liuyi','bj',20),('chener','sh',21);
Query OK, 2 rows affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from info;
+-----+--------+---------+-----+
| ind | name | address | age |
+-----+--------+---------+-----+
| 1 | liuyi | bj | 20 |
| 2 | chener | sh | 21 |
+-----+--------+---------+-----+
2 rows in set (0.00 sec)
-
創建索引有三種方式
創建表 直接定義
create index 索引名稱 on 表名 (列名1,列名2);
alter table 表名 add index 索引名稱 (列名);(更改表結構方式)
創建表 直接定義示例:
mysql> create table user(
-> id int(4) not null primary key auto_increment,
-> name varchar(10) not null,
-> score decimal not null,
-> hobby int(2) not null default '1',
-> index index_score(score));
Query OK, 0 rows affected (0.03 sec)
#在創建時直接定義score爲索引
-
查詢索引有兩種方式
show index from info(表名);
show keys from info(表名);
1.6.1 創建普通索引
普通索引創建語句爲: create index <索引的名字> on tablename(列的列表);
mysql> create index index_age on info (age);
Query OK, 0 rows affected (0.09 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show index from info; #查詢info表的索引
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| info | 0 | PRIMARY | 1 | ind | A | 2 | NULL | NULL | | BTREE | | |
| info | 1 | index_age | 1 | age | A | 2 | NULL | NULL | | BTREE | | |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)
查詢可見除了primary主鍵索引之外還有一個index_age索引
同時刪除索引語句:drop index index_age on info(表名);
mysql> drop index index_age on info;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show index from info; #查詢info表的索引
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| info | 0 | PRIMARY | 1 | ind | A | 2 | NULL | NULL | | BTREE | | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
1.6.2 創建唯一索引
唯一索引創建語句:create unique index unique_name(字段) on info (name);(表名(字段))
mysql> create unique index unique_name on info (name);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show index from info; #查詢info表的索引
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| info | 0 | PRIMARY | 1 | ind | A | 2 | NULL | NULL | | BTREE | | |
| info | 0 | unique_name | 1 | name | A | 2 | NULL | NULL | | BTREE | | |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)
刪除唯一索引語句:drop index unique_name on info;
1.6.3 創建主鍵索引
創建主鍵索引的語句:
create table tablename([…]),primary key (列的列表));
alter table tablename add primary key (列的列表));
以上兩種創建方式第一種在創建的時候進行定義,第二種在表創建完畢時以更改表結構的方式添加組件索引
1.6.4 創建全文索引
創建全文索引語法句:create fulltext index <索引的名字> on tablename (列的列表);
mysql> create fulltext index index_address on info(address);
Query OK, 0 rows affected, 1 warning (0.22 sec)
Records: 0 Duplicates: 0 Warnings: 1
mysql> show index from info; #查詢info表的索引
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| info | 0 | PRIMARY | 1 | ind | A | 2 | NULL | NULL | | BTREE | | |
| info | 0 | unique_name | 1 | name | A | 2 | NULL | NULL | | BTREE | | |
| info | 1 | index_address | 1 | address | NULL | 2 | NULL | NULL | YES | FULLTEXT | | |
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)
1.7 表的文件分類
- 表的結構文件
- 表的數據文件
- 表的索引文件
- mylsam不支持事務,但讀取性能好。
補充一:這裏介紹一種關聯查詢語句
首先先創建三個表,內容如下:
mysql> select * from hob;
+----+----------+
| id | hob_name |
+----+----------+
| 1 | read |
| 2 | running |
| 3 | game |
+----+----------+
3 rows in set (0.00 sec)
mysql> select * from info;
+-----+--------+---------+-----+
| ind | name | address | age |
+-----+--------+---------+-----+
| 1 | liuyi | bj | 20 |
| 2 | chener | sh | 21 |
+-----+--------+---------+-----+
2 rows in set (0.00 sec)
mysql> select * from user;
+----+--------+-------+-------+
| id | name | score | hobby |
+----+--------+-------+-------+
| 1 | test01 | 88 | 1 |
| 2 | stu01 | 99 | 2 |
| 3 | wangwu | 77 | 3 |
+----+--------+-------+-------+
3 rows in set (0.00 sec)
關聯查詢:
mysql> select user.name,hob.hob_name from user inner join hob on user.hobby=hob.id;
+--------+----------+
| name | hob_name |
+--------+----------+
| test01 | read |
| stu01 | running |
| wangwu | game |
+--------+----------+
3 rows in set (0.00 sec)
select user.name,hob.hob_name from user inner join hob on user.hobby=hob.id;
關聯查詢user表中的name與hob表中的hob.name,選擇輸出user.hobby與hob.id相等的字段。
inner join(關聯) 表名1 on 表名2
也可以將表以別名的形式代替,示例:
mysql> select u.name,h.hob_name from user u inner join hob h on u.hobby=h.id;
+--------+----------+
| name | hob_name |
+--------+----------+
| test01 | read |
| stu01 | running |
| wangwu | game |
+--------+----------+
3 rows in set (0.00 sec)
補充二:創建表和索引的小知識點
create table info (id int not null primary key auto_increment,name char(10) not null,score decimal(5,2);
##decimal:浮點型,小數點,例如:decimal(5,2)表示五個有效數字,兩個小數,例如:100.00'
##int不填寫具體指,默認爲11個字符'
##插入數據時,不寫列的時候,默認是從第一個列開始匹配'
二、事務
2.1 事務的基本概念
- 事務是一種機制、一個操作序列,包含了一組數據庫操作命令,並且把所有的命令作爲一個整體一起向系統提交或撤銷操作請求,即這一組數據庫命令要麼都執行,要麼都不執行
- 事務是一個不可分割的工作邏輯單元,在數據庫系統上執行併發操作時,事務是最小的控制單元
- 適用於多用戶同時操作的數據庫系統的場景,如銀行、保險公司及證券交易系統等等
- 通過事務的整體性以保證數據的一致性
回滾:如果事務成功了一部分,一部分未成功,則執行回滾,回到事務的起點,重新開始操作
2.2 事務的ACID特點
-
原子性 (Atomictity)
事務是一個完整的操作,事務的各元素是不可分的(原子的)
事務中的所有元素必須作爲一個整體提交或回滾
如果事務中的任何元素失敗,則整個事務將失敗
-
一致性 (Consistency)
當事務完成時,數據必須處於一直狀態:在事務開始之前,數據庫中存儲的數據處於一致狀態;在正在進行的事務中,數據可能處於不一致的狀態;當事務成功完成時,數據必須在此回到已知的一致狀態
-
隔離性 (Isolation)
對數據進行修改的所有併發事務時彼此隔離的,這表名事務必須是獨立的,它不應以任何方式依賴於或影響其他事務
修改數據的事務可以在另一個使用相同數據的事務開始之前訪問這些數據,或者在另一個使用相同數據的事務結束之後訪問這些數據
-
持久性 (Durability)
事務持久性指不管系統是否發生故障,事務處理的結果都是永久的
一旦事務被提交,事務的效果會被永久的保留在數據庫中
2.3 事務的操作
-
默認情況下MySQL的事務是自動提交的,當sql語句提交時事務便自動提交
-
手動對事務進行控制的方法
事務處理命令控制
使用set設置事務處理方式
2.3.1 事務處理命令控制
- begin :開始一個事務
- commit:提交一個事務
- rollback:回滾一個事務
2.3.2 使用set命令進行控制
- set autocommit=0:禁止自動提交
- set autocommit=1:開始自動提交
示例:
環境:在mysql中創建school數據庫,創建info表,內容如下
mysql> select * from info;
+-----+--------+---------+-----+
| ind | name | address | age |
+-----+--------+---------+-----+
| 1 | liuyi | bj | 20 |
| 2 | chener | sh | 21 |
+-----+--------+---------+-----+c
2 rows in set (0.00 sec)
① 開始事務(方式一):
mysql> begin; #開啓事務
Query OK, 0 rows affected (0.00 sec)
mysql> update info set name='zhangsan' where name='liuyi'; #將name字段中liuyi改爲zhangsan
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> commit; #提交事務
Query OK, 0 rows affected (0.00 sec)
mysql> select * from info;
+-----+----------+---------+-----+
| ind | name | address | age |
+-----+----------+---------+-----+
| 1 | zhangsan | bj | 20 |
| 2 | chener | sh | 21 |
+-----+----------+---------+-----+
2 rows in set (0.00 sec)
開始事務(方式二)
mysql> set autocommit=0; #禁止事務自動提交
Query OK, 0 rows affected (0.00 sec)
mysql> update info set name='lisi' where name='chener';
Query OK, 1 row affected (0.00 sec) #將info表name字段中chener更改爲lisi
Rows matched: 1 Changed: 1 Warnings: 0
mysql> commit; #提交事務
Query OK, 0 rows affected (0.00 sec)
mysql> select * from info;
+-----+----------+---------+-----+
| ind | name | address | age |
+-----+----------+---------+-----+
| 1 | zhangsan | bj | 20 |
| 2 | lisi | sh | 21 |
+-----+----------+---------+-----+
2 rows in set (0.00 sec)
② 回滾(rollback):
mysql> begin; #開始十五
Query OK, 0 rows affected (0.00 sec)
mysql> update info set name='wangwu' where name='zhangsan'; #將info表name字段中zhangsan改爲wangwu。
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from info; #查看錶信息
+-----+--------+---------+-----+
| ind | name | address | age |
+-----+--------+---------+-----+
| 1 | wangwu | bj | 20 |
| 2 | lisi | sh | 21 |
+-----+--------+---------+-----+
2 rows in set (0.00 sec)
mysql> savepoint a; #創建存檔a
Query OK, 0 rows affected (0.00 sec)
mysql> update info set name='zhaoliu' where name='lisi'; #將info表name字段lisi更改爲zhaoliu
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> savepoint b; #創建存檔b
Query OK, 0 rows affected (0.00 sec)
mysql> select * from info; #查看錶信息
+-----+---------+---------+-----+
| ind | name | address | age |
+-----+---------+---------+-----+
| 1 | wangwu | bj | 20 |
| 2 | zhaoliu | sh | 21 |
+-----+---------+---------+-----+
2 rows in set (0.00 sec)
mysql> rollback to a; #回滾到存檔a中(存檔a之後的設置不生效)
Query OK, 0 rows affected (0.00 sec)
mysql> select * from info; #查看錶信息
+-----+--------+---------+-----+
| ind | name | address | age |
+-----+--------+---------+-----+
| 1 | wangwu | bj | 20 |
| 2 | lisi | sh | 21 |
+-----+--------+---------+-----+
2 rows in set (0.00 sec)
mysql> rollback; #回滾到事務開始,存檔a的設置不生效
Query OK, 0 rows affected (0.01 sec)
mysql> select * from info; #查看錶信息
+-----+----------+---------+-----+
| ind | name | address | age |
+-----+----------+---------+-----+
| 1 | zhangsan | bj | 20 |
| 2 | lisi | sh | 21 |
+-----+----------+---------+-----+
2 rows in set (0.00 sec)
mysql> commit; #提交事務
Query OK, 0 rows affected (0.00 sec)
mysql> select * from info; #查看錶信息
+-----+----------+---------+-----+
| ind | name | address | age |
+-----+----------+---------+-----+
| 1 | zhangsan | bj | 20 |
| 2 | lisi | sh | 21 |
+-----+----------+---------+-----+
2 rows in set (0.00 sec)
小結:
- 使用rollback只能向前回滾,無法向後
- 使用commit提交後,事務結束,此時再次使用的rollback屬於另一個新的事務,對於已經commit的食物沒有任何作用
- begin執行與autocommit類似。
三、視圖與存儲過程
3.1 視圖的概念
- 視圖是一張虛擬的表,數據不存在試圖中,真實表的映射數據
- 利用,條件篩選,分組,排序等產生出一個結果集。並且做成持久化保存。(並不保存數據,只保存映射,存儲於內存中)
- 視圖佔用資源相對內存小,真實表中數據變化,視圖會對應變化
3.2 創建視圖
創建以下表
mysql> select * from hob;
+----+----------+
| id | hob_name |
+----+----------+
| 1 | read |
| 2 | running |
| 3 | game |
+----+----------+
3 rows in set (0.00 sec)
mysql> select * from info;
+-----+--------+---------+-----+
| ind | name | address | age |
+-----+--------+---------+-----+
| 1 | liuyi | bj | 20 |
| 2 | chener | sh | 21 |
+-----+--------+---------+-----+
2 rows in set (0.00 sec)
mysql> select * from user;
+----+--------+-------+-------+
| id | name | score | hobby |
+----+--------+-------+-------+
| 1 | test01 | 88 | 1 |
| 2 | stu01 | 99 | 2 |
| 3 | wangwu | 77 | 3 |
+----+--------+-------+-------+
3 rows in set (0.00 sec)
創建視圖、多表相連查詢:
命令格式:
① 創建視圖
create view <視圖名稱>;
create view info_view as select id,name,age from info 條件;
(多表相連的條件是on、單表的條件是where)
② 查詢視圖
select * fom info_view;
select name,age from info_view;
示例:
mysql> create view view_user as select u.name,h.hob_name from user u inner join hob h on u.hobby=h.id;
Query OK, 0 rows affected (0.00 sec)
mysql> select * fom view_user;
+--------+----------+
| name | hob_name |
+--------+----------+
| test01 | read |
| stu01 | running |
| wangwu | game |
+--------+----------+
4 rows in set (0.00 sec)
3.2.1 視圖的特點
- 安全性高
- 簡化sql操作
- 可以針對不同用戶創建不同的視圖(不同權限的用戶瀏覽不同的信息)
3.3 存儲過程
3.3.1 存儲過程概念
-
存儲過程:多用於軟件開發
存儲過程是防止代碼在網絡傳輸過程中被截獲,做了安全性保障
-
原始狀態:在代碼過程中需要嵌入sql語句,通過連接驅動把sql語句作爲參數,傳遞給mysql(數據庫)進行執行,此時就會有安全風險
-
通過存儲過程解決安全隱患
存儲過程是寫在數據庫中,並不是程序中。
程序是通過調用存儲過程名稱去觸發操作。(類似調用函數)
3.3.2 存儲過程的優點
優點:代碼量優化,傳輸安全,網絡資源優化
四、存儲引擎
4.1 存儲引擎概念
-
MySQL中的數據用各種不同的技術存儲在文件中,每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並最終提供不同的功能和能力,這些不同的技術以及配套的功能在MySQL中稱爲存儲引擎
-
存儲引擎就是MySQL將數據存儲在文件系統中的存儲方式或存儲格式
-
目前MySQL常用的兩種存儲引擎:
MylSAM
InnoDB
-
MySQL存儲引擎是MySQL數據庫服務器中的組件,負責數據庫執行世紀的數據I/O操作
-
使用特殊存儲引擎的主要優點包括:
僅需提供特殊應用所需的特性
數據庫中的系統開銷較小
具有更有效和更高的數據庫性能
-
MySQL系統中,存儲引擎處於文件系統之上,在數據保存到數據文件之前會傳輸到存儲引擎,之後按照各個存儲引擎的存儲格式進行存儲
-
從程序開發角度考慮
不同語言安裝不同的驅動創建不同的connector
connection pool中有多個對象(空閒的進程/線程)
connector和connection pool的對象連接MySQL server
連接池作用:優化連接效率
-
從系統(物理)層面考慮
依靠進程或者線程鏈接數據庫的對象,就需要.sock文件創建pid去連接
在連接上之後,需要尋找數據,這些數據放在file system (管理工具,物理層面:磁盤、磁道、扇區上)NSS EST
-
具體文件內容通過存儲引擎存儲在硬盤上,通過各種管理工具(Management Server)管理(權限、羣集、備份還原管理等)
privilege:特權
parser:分析器
query:查詢
optimizer:優化程序
數據庫的日誌文件是數據庫命脈,需要單獨備份。
4.2 MylSAM
4.2.1 MylSAM介紹
-
MylSAM存儲引擎是MySQL關係數據庫系統5.5版本之前默認的存儲引擎,前身是ISAM
-
ISAM是一個定義明確且經理時間考驗的數據表格管理方法,在設計之時就考慮到數據庫被查詢的次數要遠大於更新的次數
-
ISAM的特點
ISAM執行讀取操作的速度很快
不支持事務處理
不佔用大量的內存和存儲資源
不能夠容錯
使用create table 創建時,默認使用的是MylSAM存儲引擎
- MylSAM管理非事務表,時ISAM的擴展格式
- 提供ISAM裏所沒有的索引和字段管理的大量功能
- MylSAM使用一種表格鎖定的機制,以優化多個併發的讀寫操作
- MylSAM提供高速存儲和檢索,以及全文搜索能力,收到web開發的青睞
4.2.2 MylSAM特點
-
不支持事務
-
表級鎖定形式,數據在更新時鎖定整個表
-
數據庫在讀寫過程中相互阻塞
會在數據寫入的過程阻塞用戶數據的讀取
也會在數據讀取額過程中阻塞用戶的數據寫入
-
可通過key_buffer_size來設置緩存索引,提高訪問性能,減少磁盤IO的壓力
但緩存只會緩存索引文件,不會緩存數據
-
採用MylSAM存儲引擎數據單獨寫入或讀取,速度過程比較快且佔用資源下個對少
-
MylSAM存儲引擎不支持外鍵約束,只支持全文索引
-
每個MylSAM在磁盤上存儲成三個文件,每一個文件的名字以表的名字開始,擴展名指出文件類型
-
MylSAM在磁盤上存儲的文件
.frm文件存儲表定義
數據文件的擴展名爲.MYD (MYData)
索引文件的擴展名是.MYI (MYIndex)
4.2.3 MyISAM使用的生產場景
- 公司業務不需要事務的支持
- 一般單方面讀取數據比較多的業務,或單方面寫入數據比較多的業務
- MyISAM存儲引擎數據讀寫都比較頻繁的場景不適合
- 使用讀寫併發訪問相對較低的業務
- 數據修改相對較少的業務
- 對數據業務一致性要求不是非常高的業務
- 服務器硬件資源相對比較差
4.3 InnoDB特點
- 支持事務:支持4個事務隔離級別
- 行級鎖定,但是全表掃描仍然會是表級鎖定
- 讀寫阻塞與事務隔離級別相關
- 具有非常高效的緩存特性:能緩存索引,也能緩存數據
- 表與主鍵以簇的方式存儲
- 支持分區、表空間,類似oracle數據庫
- 支持外鍵約束,5.5以前不支持全文索引,5.5版本以後支持全文索引
- 對硬件資源要求還是比較高的場合
4.3.1 InnoDB 使用生產場景分析
- 業務需要事務的支持
- 行級鎖定對高併發有很好的適應能力,但需要確保查詢是通過索引來完成的
- 業務數據更新較爲頻繁的場景,如:論壇,微博等
- 業務數據一直習慣要求較高,例如:銀行業務
- 硬件設備內存較大, 利用Innodb較號的緩存能力來提高內存利用率,減少磁盤IO的壓力
4.4 企業選擇存儲引擎依據
-
需要考慮每個存儲引擎提供了哪些不同的核心功能及應用場景
-
支持的字段和數據類型
索引引擎都支持通用的數據類型
但不是索引的引擎都支持其他字段類型,如二進制對象
-
鎖定類型:不同的存儲引擎支持不同級別的索引
表鎖定
行鎖定
-
索引的支持
建立索引在搜索和恢復數據庫中的數據的時候能夠顯著提高性能
不同的存儲引擎提供不同的製作索引的技術
有些存儲引擎根本不支持索引
-
事務處理的支持
事務處理功能通過提供在向表中更新和插入信息器間的可靠性
可根據企業業務是否要支持事務選擇存儲引擎
4.5 配置存儲引擎
-
在企業中選擇好合適的存儲引擎之後,就可以進行修改了
-
修改步驟:
① 查看數據庫可配置的存儲引擎
② 查看錶正在使用的存儲引擎
③ 配置存儲引擎爲所選擇的類型
-
使用show engines查看系統支持的存儲引擎
-
查看錶使用的存儲引擎
方法1 : show table status from 庫名 where name=‘表名’;
方法2 : show create table 表名;
示例:
方式一:
mysql> show table status from school where name='info';
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| info | InnoDB | 10 | Dynamic | 2 | 8192 | 16384 | 0 | 0 | 0 | 3 | 2020-01-13 14:15:04 | 2020-01-13 14:25:49 | NULL | utf8_general_ci | NULL | | |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
1 row in set (0.01 sec)
方式二:
mysql> use school
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show create table info;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| info | CREATE TABLE "info" (
"ind" int(4) NOT NULL AUTO_INCREMENT,
"name" varchar(10) NOT NULL,
"address" varchar(50) DEFAULT 'nj',
"age" int(3) NOT NULL,
PRIMARY KEY ("ind")
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
#info表存儲引擎是InnoDB
4.5.1 修改存儲引擎
方式一:alter table 修改
格式:alter table table_name engine=引擎;
示例:
mysql> alter table info engine=myisam;
Query OK, 2 rows affected (0.05 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> show create table info;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| info | CREATE TABLE "info" (
"ind" int(4) NOT NULL AUTO_INCREMENT,
"name" varchar(10) NOT NULL,
"address" varchar(50) DEFAULT 'nj',
"age" int(3) NOT NULL,
PRIMARY KEY ("ind")
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql>
#修改後 存儲引擎改爲myisqm
方式二:修改my.cnf,指定默認存儲引擎並重啓服務
格式:default-storage-engine=InnoDB
示例:
保存退出後重啓服務
systemctl stop mysqld
systemctl stop mysqld
方式三:create table 創建表時指定存儲引擎
格式:create table engine Test(id int) engine=MyISAM;
示例:
mysql> create table enginetest(id int) engine=myisam;
Query OK, 0 rows affected (0.01 sec)
mysql> show create table enginetest;
+------------+----------------------------------------------------------------------------------------------+
| Table | Create Table |
+------------+----------------------------------------------------------------------------------------------+
| enginetest | CREATE TABLE "enginetest" (
"id" int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+------------+----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
方法四:Mysql_convert_table_format 轉化存儲引擎
格式:/usr/local/mysql/bin/mysql_convert_table_format --user=root --password=‘123123’ --sock=/tmp/mysql.sock auth --engine=myisam client info
[root@localhost ~]# yum install perl-DBI perl-DBD-MySQL -y
[root@localhost ~]# /usr/local/mysql/bin/bysql_convert_table_format --user=root --passwork='123' --sock=/tmp/mysql.sock auth
總結:
數據庫中的sql語句無法進行補全,所以在輸入時要注意字符、符號、空格的位置以及定義的類型是否有誤,在日常操作過程中,對數據庫需要進行定期備份與處理,之後的博客中將會對數據庫備份進行介紹