MySQL索引與事務、存儲引擎MyISAM和InnoDB (理論+實踐篇)

索引的概念

數據庫中的索引與書籍中的目錄相似

  • 在一本書中,無須閱讀整本書,利用目錄就能夠快速查找所需信息
  • 書中的目錄是一個詞語列表,其中註明了包含各個詞的頁碼

數據庫索引

  • 在數據庫中,索引使數據庫程序無須對整個表進行掃描,就能夠在其中找到所需數據
  • 數據庫中的索引|是某個表中一-列或者若干列值的集合,以及物理標識這些值的數據頁的邏輯指針清單

索引的的做用

  • 設置了合適的索引以後,數據庫利用各類快速的定位技術,可以大大加快查詢速率
  • 特別是當表很大時,或者查詢涉及到多個表時,使用索引可以使查詢加快成3 F倍
  • 能夠下降數據庫的I0成本,而且索引還能夠下降數據庫的排序成本
  • 經過建立惟一性索引保證數據表數據的惟- -性能夠加快表與表之間的鏈接
  • 在使用分組和排序時,可大大減小分組和排序時間

索引的分類

普通索引

  • 這是最基本的索引類型,並且它沒有惟一性之類的限制

惟一性索引

  • 這種索引和前面的「普通索引」基本相同,但有一個區別:索引列表的全部值都只能出現一次,即必須惟一

主鍵

  • 主鍵是一種惟一索引,但它必須指定爲「PRIMARY KEY"

全文索引

  • MySQL從3.23.23版開始支持全文索引和全文檢索。在MySQL中,全文索引的索引類型爲FULLTEXT, 全文索引能夠在VARCHAR或者TEXT類型的列上建立

單列索引與多列索引

  • 索引能夠是單列上建立的索引,也能夠是在多列上建立的索引

建立索引的原則依據

  • 表的主鍵、外鍵必須有索引
  • 數據量超過300行的表應該有索引
  • 常常與其餘表進行鏈接的表,在鏈接字段上應該創建索引
  • 惟一性太差的字段不適合創建索引
  • 更新太頻繁的字段不適合建立索引
  • 常常出如今Where子句中的字段,特別是大表的字段,應該創建索引
  • 索引應該創建在選擇性高的字段上
  • 索引應該建在小字段上,對於大的文本字段甚至超長字段,不要建索引

建立索引的方法

  • 根據企業需求選擇了合適的索引以後,可使用CREATE INDEX建立索引
  • CREATE INDEX 加上各個索引的關鍵字即可以建立各個類型的索引

建立普通索引

CREATE INDEX <索引的名字> ON tablename(列的列表);mysql

普通索引實例

CREATE INDEX salary index ON IT salary(薪資);sql

建立惟一性索引

CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);數據庫

惟一性索引實例

CREATE UNIQUE INDEX salary_unique_index ON IT_salary(姓名);vim

建立主鍵索引

CREATE TABLE tablename ( [..], PRIMARY KEY (列的列表) );
ALTER TABLE tablename ADD PRIMARY KEY (列的列表); //添加表結構的方式建立主鍵索引緩存

建立主鍵索引實例

ALTER TABLE IT_ salary ADD PRIMARY KEY (員工ID);服務器

查看索引

SHOW INDEX FROM tablename;
SHOW KEYS FROM tablename;併發

查看索引實例

SHOW INDEX FROM IT_salary;
SHOW KEYS FROM IT_salary;oracle

事務的概念

  • 事務是一種機制、一個操做序列,包含了一組數據庫操做命令,而且把全部的命令做爲一個總體一塊兒向系統提交或撤銷操做請求,即一組數據庫命令要麼都執行,要麼都不執行
  • 事務是一個不可分割的工做邏輯單元,在數據庫系統上執行併發操做時,事務是最小的控制單元
  • 適用於多用戶同時操做的數據庫系統的場景,如銀行、保險公司及證券交易系統等等
  • 經過事務的總體性以保證數據的一致性

事務的ACID特色

原子性(Atomicity)

  • 事務是一個完整的操做,事務的各元素是不可分的(原子的)
  • 事務中的全部元素必須做爲一個總體提交或回滾
  • 若是事務中的任何元素失敗,則整個事務將失敗

一致性(Consistency)

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

隔離性. (Isolation)

  • 對數據進行修改的全部併發事務是彼此隔離的,這代表事務必須是獨立的,它不該以任何方式依賴於或影響其餘事務
  • 修改數據的事務能夠在另外一個使用相同數據的事務開始以前訪問這些數據,或者在另外一個使用相同數據的事務結束以後訪問這些數據

持久性(Durability)

  • 事務持久性指無論系統是否發生故障,事務處理的結果都是永久的
  • 一旦事務被提交,事務的效果會被永久地保留在數據庫中

事務的操做

  • 認狀況下MySQL的事務是自動提交的,當sq|語句提交時事務便自動提交
  • 手動對事務進行控制的方法
    • 事務處理命令控制
    • 使用set設置事務處理方式

事務處理命令控制事務

  • begin:開始一個事務
  • commit:提交一個事務
  • savepoint <標記名> 打標記/存檔
  • rollback:回滾一個事務

使用set命令進行控制

  • et autocommit=0:禁止自動提交
  • set autocommit=1:開啓自動提交

存儲引擎概念介紹

  • MySQL中的數據用各類不一樣的技術存儲在文件中,每種技術都使用不一樣的存儲機制、索引技巧、鎖定水平並最終提供不一樣的功能和能力,這些不一樣的技術以及配套的功能在MySQL 中稱爲存儲引擎
  • 存儲引擎就是MySQL將數據存儲在文件系統中的存儲方式或者存儲格式
  • 目前MySQL經常使用的兩種存儲引擎
    • MyISAM(輕量級)
    • InnoDB
  • MySQL存儲引擎是MySQL數據庫服務器中的組件,負責爲數據庫執行實際的數據1/0操做
  • 使用特殊存儲引擎的主要優勢之一在於,僅需提供特殊應用所需的特性,數據庫中的系統開銷較小,具備更有效和更高的數據庫性能
  • MySQL系統中,存儲引擎處於文件系統之上,在數據保存到數據文件以前會傳輸到存儲引擎,以後按照各個存儲引擎的存儲格式進行存儲

MyISAM的介紹

  • MyISAM存儲引擎是MySQL關係數據庫系統5.5版本以前默認的存儲引擎,前身是ISAM
  • ISAM是一個定義明確且歷經時間考驗的數據表格管理方法,在設計之時就考慮到數據庫被查詢的次數要遠大於更新的次數
  • ISAM的特色
    • ISAM執行讀取操做的速度很快,
    • 它不支持事務處理
    • 並且不佔用大量的內存和存儲資源
    • 不可以容錯
  • 數據存儲位置:
    • 表定義文件
    • 表數據存儲文件
    • 表索引文件

MyISAM的特色

  • 不支持事務
  • 表級鎖定形式,數據在更新時鎖定整個表
  • 數據庫在讀寫過程當中相互阻塞
    • 會在數據寫入的過程阻塞用戶數據的讀取
    • 也會在數據讀取的過程當中阻塞用戶的數據寫入
  • 可經過key_buffer_size來設置緩存索引,提升訪問性能,減小磁盤IO的壓力
    • 但緩存只會緩存索引文件,不會緩存數據
  • 採用MyISAM存儲引擎數據單獨寫入或讀取,速度過程較快且佔用資源相對少
  • MyISAM存儲引擎它不支持外鍵約束,只支持全文索引
  • 每一個MyISAM在磁盤.上存儲成三個文件,每- -個文件的名字以表的名字開始,擴展名指出文件類型
  • MyISAM在磁盤上存儲的文件
    • frm文件存儲表定義
    • 數據文件的擴展名爲.MYD (MYData)
    • 索引文件的擴展名是.MYI (MYIndex)

MyISAM適用的生產場景舉例

  • 公司業務不須要事務的支持
  • 通常單方面讀取數據比較多的業務,或單方面寫入數據比較多的業務
  • MyISAM存儲引擎數據讀寫都比較頻繁場景不適合使用讀寫併發訪問相對較低的業務
  • 數據修改相對較少的業務
  • 對數據業務-致性要求不是很是高的業務服務器硬件資源相對比較差

InnoDB特色介紹

  • 支持事務:支持4個事務隔離級別
  • 行級鎖定,可是全表掃描仍然會是表級鎖定讀寫阻塞與事務隔離級別相關
  • 具備很是高效的緩存特性:能緩存索引,也能緩存數據
  • 表與主鍵以簇的方式存儲3
  • 支持分區、表空間,相似oracle數據庫
  • 支持外鍵約束,5.5之前不支持全文索引,5.5版本之後支持全文索引
  • 對硬件資源要求仍是比較高的場合

InnoDB適用生產場景分析

  • 業務須要事務的支持
  • 行級鎖定對高併發有很好的適應能力,但需確保查詢是經過索引來完成
  • 業務數據更新較爲頻繁的場景,如:論壇,微博等
  • 業務數據一致性要求較高,例如:銀行業務
  • 硬件設備內存較大,利用Innodb較好的緩存能力來提升內存利用率,減小磁盤I0的壓力

企業選擇存儲引擎依據

  • 須要考慮每一個存儲引擎提供了哪些不一樣的核心功能及應用場景
  • 支持的字段和數據類型
    • 全部引|擎都支持通用的數據類型
    • 但不是全部的引擎都支持其它的字段類型,如二進制對象
  • 鎖定類型:不一樣的存儲引擎支持不一樣級別的鎖定
    • 表鎖定
    • 行鎖定

配置存儲引擎

  • 在企業中選擇好合適的存儲引擎以後,就能夠進行修改了
  • 修改步驟
    • 查看數據庫可配置的存儲引擎
    • 查看錶正在使用的存儲引擎
    • 配置存儲引擎爲所選擇的類型
  • 使用show engines查看系統支持的存儲引擎
  • 查看錶使用的存儲引擎
    • 方法1: show table status from 庫名 where name='表名;
    • 方法2: show create table 表名;

修改存儲引擎

  • 方法1: alter table修改;
    • alter table table_ name engine=引擎;
  • 方法2:修改my.cnf,指定默認存儲引擎並重啓服務
    • default-storage-engine=InnDB
  • 方法3: create table建立表時指定存儲引擎
    • create table 表名 (字段) engine= 引擎
  • 方法4: Mysql convert table format 轉化存儲引擎
    • Mysql convert table format -user=root -password=密碼
    • sock=/tmp/mysql.sock-engine=引擎 庫名 表名

實例

建立索引

mysql> create index index_age on info (age);   ##建立普通索引
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from 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 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          1 | index_age |            1 | age         | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

mysql> drop index index_age on info;   ##刪除表中的索引
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from 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 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.01 sec)

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;  ##查看錶中索引
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| 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 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          0 | unique_name |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

mysql> drop index unique_name on info;  ##刪除表中的索引
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from 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 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

mysql> alter table info add unique index index_name (name);   ##使用alter插入表索引
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from 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 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          0 | index_name |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

全文索引、組合索引

mysql> select * from info;     ##查看錶內容
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
+----+----------+----------+-----+
2 rows in set (0.00 sec)

mysql> show index from 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 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          0 | index_name |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

mysql> create fulltext index full_addr on info (address);      ##以address建立全文索引
Query OK, 0 rows affected, 1 warning (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 1

mysql> show index from 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 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          0 | index_name |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          1 | full_addr  |            1 | address     | NULL      |           2 |     NULL | NULL   | YES  | FULLTEXT   |         |               |
+-------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)

mysql> select * from user;     ##查看user表內容
+----+--------+-------+-------+
| id | name   | score | hobby |
+----+--------+-------+-------+
|  1 | test01 |    88 |     3 |
|  2 | stu01  |    99 |     2 |
|  3 | wangwu |    77 |     3 |
+----+--------+-------+-------+
3 rows in set (0.00 sec)

mysql> create index index_name_score on user (name,score);    ##建立name和score的組合索引
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from user;   ##查看錶索引
+-------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name         | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user  |          0 | PRIMARY          |            1 | id          | A         |           3 |     NULL | NULL   |      | BTREE      |         |               |
| user  |          1 | index_score      |            1 | score       | A         |           3 |     NULL | NULL   |      | BTREE      |         |               |
| user  |          1 | index_name_score |            1 | name        | A         |           3 |     NULL | NULL   |      | BTREE      |         |               |
| user  |          1 | index_name_score |            2 | score       | A         |           3 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)

兩個表,進行關聯,多表查詢

mysql> create table user(     ##建立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',  ##默認1
        -> index index_score (score));    ##設置索引score
Query OK, 0 rows affected (0.01 sec)

mysql> desc user;  ##查看錶結構
+-------+---------------+------+-----+---------+----------------+
| Field | Type          | Null | Key | Default | Extra          |
+-------+---------------+------+-----+---------+----------------+
| id    | int(4)        | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10)   | NO   |     | NULL    |                |
| score | decimal(10,0) | NO   | MUL | NULL    |                |
| hobby | int(2)        | NO   |     | 1       |                |
+-------+---------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> insert into user (name,score,hobby) values ('test01',88,1),('stu01',99,2),('wangwu',77,3); 
##向表中插入數據
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

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> create table hob(     ##建立hob表
        -> id int(2) not null primary key,
        -> hob_name varchar(10) not null);
Query OK, 0 rows affected (0.00 sec)

mysql> desc hob;   ##查看錶結構
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(2)      | NO   | PRI | NULL    |       |
| hob_name | varchar(10) | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> insert into hob (id,hob_name) values (1,'看書'),(2,'運動'),(3,'聽歌');   ##插入表數據
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from hob;   ##查看錶內容
+----+----------+
| id | hob_name |
+----+----------+
|  1 | 看書     |
|  2 | 運動     |
|  3 | 聽歌     |
+----+----------+
3 rows in set (0.00 sec)

mysql> select * from user inner join hob on user.hobby=hob.id;   ##關聯user和hob兩張表
+----+--------+-------+-------+----+----------+
| id | name   | score | hobby | id | hob_name |
+----+--------+-------+-------+----+----------+
|  1 | test01 |    88 |     1 |  1 | 看書     |
|  2 | stu01  |    99 |     2 |  2 | 運動     |
|  3 | wangwu |    77 |     3 |  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內容
+--------+----------+
| name   | hob_name |
+--------+----------+
| test01 | 看書     |
| stu01  | 運動     |
| wangwu | 聽歌     |
+--------+----------+
3 rows in set (0.00 sec)

mysql> select u.name,h.hob_name from user u inner join hob h on u.hobby=h.id; ##設置簡易名稱
+--------+----------+
| name   | hob_name |
+--------+----------+
| test01 | 看書     |
| stu01  | 運動     |
| wangwu | 聽歌     |
+--------+----------+
3 rows in set (0.00 sec)

mysql> create view view_user as select u.name,h.hob_name from user u inner join hob h on u.hobby
##建立視圖
Query OK, 0 rows affected (0.00 sec)

mysql> select * from view_user;  ##查看視圖
+--------+----------+
| name   | hob_name |
+--------+----------+
| test01 | 看書     |
| stu01  | 運動     |
| wangwu | 聽歌     |
+--------+----------+
3 rows in set (0.00 sec)

mysql> update user set hobby=3 where name='test01';  ##修改user表中內容
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from view_user;   ##查看視圖,即視圖就是表的一個連接
+--------+----------+
| name   | hob_name |
+--------+----------+
| stu01  | 運動     |
| test01 | 聽歌     |
| wangwu | 聽歌     |
+--------+----------+
3 rows in set (0.00 sec)

事務實例

開啓事務,往表中插入數據

mysql> select * from info;   ##查看錶內容數據
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
+----+----------+----------+-----+
2 rows in set (0.00 sec)

mysql> insert into info (name,address,age) values ('wangwu','hangzhou',30);##插入數據

mysql> begin;   ##開啓事務
Query OK, 0 rows affected (0.00 sec)

mysql> insert into info (name,address,age) values ('zhaoliu','hangzhou',31);  ##插入數據
Query OK, 1 row affected (0.00 sec)

mysql> savepoint a;   ##設置保存節點a
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;   ##查看錶數據
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  4 | zhaoliu  | hangzhou |  31 |
+----+----------+----------+-----+
4 rows in set (0.00 sec)

mysql> insert into info (name,address,age) values ('tianqi','hangzhou',32);  ##繼續插入數據
Query OK, 1 row affected (0.00 sec)

mysql> savepoint b;   ##設置保存節點b
Query OK, 0 rows affected (0.00 sec)

mysql> insert into info (name,address,age) values ('heiba','hangzhou',32);      ##繼續插入數據
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;  ##查看錶內容
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  4 | zhaoliu  | hangzhou |  31 |
|  5 | tianqi   | hangzhou |  32 |
|  6 | heiba    | hangzhou |  32 |
+----+----------+----------+-----+
6 rows in set (0.00 sec)

利用另外一個終端查看是否成功插入

[root@master2 ~]# mysql -uroot -p  ##進入數據庫
Enter password:     ##輸入密碼

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

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> select * from info;   ##查看錶內容,此時並無提交
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
+----+----------+----------+-----+
3 rows in set (0.00 sec)

使用回滾,返回保存的節點

mysql> rollback to b;    ##利用回滾到保存節點b
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;   ##查看錶數據
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  4 | zhaoliu  | hangzhou |  31 |
|  5 | tianqi   | hangzhou |  32 |
+----+----------+----------+-----+
5 rows in set (0.00 sec)

mysql> rollback to a;  ##回滾到保存節點a
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;   ##查看錶數據
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  4 | zhaoliu  | hangzhou |  31 |
+----+----------+----------+-----+
4 rows in set (0.00 sec)

mysql> rollback;     ##回滾到初始,退出事務狀態
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;  ##查看錶數據
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
+----+----------+----------+-----+
3 rows in set (0.00 sec)

使用commit提交事務

mysql> begin;    ##開啓事務
Query OK, 0 rows affected (0.00 sec)

mysql> insert into info (name,address,age) values ('heiba','hangzhou',32);  ##插入數據
Query OK, 1 row affected (0.00 sec)

mysql> commit;   ##提交事務
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;  ##查看錶數據
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  7 | heiba    | hangzhou |  32 |
+----+----------+----------+-----+
4 rows in set (0.00 sec)

使用另外一個終端查看

mysql> select * from info;   ##查看錶數據
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  7 | heiba    | hangzhou |  32 |
+----+----------+----------+-----+
4 rows in set (0.00 sec)

另外一種事務的操做方式

mysql> set autocommit=0;   ##設置不自動提交事務
Query OK, 0 rows affected (0.00 sec)

mysql> update info set address='beijing' where name='heiba';  ##修改表數據
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from info;   ##查看錶信息
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  7 | heiba    | beijing  |  32 |
+----+----------+----------+-----+
4 rows in set (0.00 sec)

##另外一個終端查看
mysql> select * from info;  ##查看錶信息,並無修改
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  7 | heiba    | hangzhou |  32 |
+----+----------+----------+-----+
4 rows in set (0.00 sec)

mysql> set autocommit=1;   ##開啓自動提交事務
Query OK, 0 rows affected (0.00 sec)

##另外一個終端查看
mysql> select * from info;   ##查看錶數據,此時就已經修改
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  7 | heiba    | beijing  |  32 |
+----+----------+----------+-----+
4 rows in set (0.00 sec)

存儲引擎

查看系統默認存儲引擎

mysql> show engines;   ##查看默認存儲引擎innodb
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |

mysql> show create table info;   ##查看建立的表的存儲引擎innodb

| info  | CREATE TABLE "info" (
    "id" int(4) NOT NULL AUTO_INCREMENT,
    "name" varchar(10) NOT NULL,
    "address" varchar(50) DEFAULT 'nanjing',
    "age" int(3) NOT NULL,
    PRIMARY KEY ("id"),
    UNIQUE KEY "index_name" ("name"),
    FULLTEXT KEY "full_addr" ("address")
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8

修改MySQL配置文件,設置默認的存儲引擎

[root@localhost ~]# vim /etc/my.cnf ##修改配置文件

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysql.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
default-storage-engine=Myisam   ##添加默認存儲引擎爲Myisam

[root@master2 ~]# systemctl restart mysqld.service ##重啓MySQL服務

進入數據庫

[root@master2 ~]# mysql -uroot -p   ##進入數據庫
Enter password:    ##輸入密碼

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> create table a ( id int );    ##建立一個a表
Query OK, 0 rows affected (0.00 sec)

mysql> show create table a;   ##查看錶默認的存儲引擎Myisam
+-------+-------------------------------------------------------------------------------------+
| Table | Create Table                                                                        |
+-------+-------------------------------------------------------------------------------------+
| a     | CREATE TABLE "a" (
    "id" int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> alter table a engine=innodb;  ##修改表的存儲引擎爲innodb
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table a;  ##查看錶的存儲引擎innodb
+-------+-------------------------------------------------------------------------------------+
| Table | Create Table                                                                        |
+-------+-------------------------------------------------------------------------------------+
| a     | CREATE TABLE "a" (
    "id" int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
相關文章
相關標籤/搜索