mysql事務

mysql事務

事務的概念

事務是一種機制,一個操作序列,包含了一組數據庫操作命令,並且把所有命令作爲一個整體一起想系統提交或撤銷操作請求,
即這一組數據庫命令要麼都執行,要麼都不執行,事務是一個不可分割的工作邏輯單元,在數據庫系統上執行併發操作時,
事務是最小的控制單元,事務適用於用戶同時操作數據庫系統的場景,如銀行,保險公司
以及證券交易系統等,通過事務的整體以保證數據的一致性,事務是保證了一組操作的平穩性和可預測性的技術。

事務的四大特性(ACID)

如果一個數據庫聲稱支持事務的操作,那麼該數據庫必須要具備以下四個特性:

原子性(Atomicity

  原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。

一致性(Consistency)

  一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。
  拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。

隔離性(Isolation

  隔離性是當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。
  即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後纔開始,這樣每個事務都感覺不到有其他事務在併發地執行。

持久性(Durability

  持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。
  例如我們在使用JDBC操作數據庫時,在提交事務方法後,提示用戶事務操作完成,當我們程序執行完成直到看到提示後,就可以認定事務以及正確提交,
即使這時候數據庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是數據庫因爲故障而沒有執行事務的重大錯誤。

事務的隔離級別(默認事務級別爲可重複讀)

總的說,數據庫事務無非就兩種:讀取事務(select)、修改事務(update,insert)。在沒有事務隔離控制的時候,多個事務在同一時刻對同一數據的操作可能就會影響到最終期望的結果,通常有四種情況:
(1) 兩個更新事務同時修改一條數據時,很顯然這種情況是最嚴重的了,程序中無論如何也不能出現這種情況,因爲它會造成更新的丟失!
(2) 一個更新事務更新一條數據時,另一個讀取事務讀取了還沒提交的更新,這種情況下會出現讀取到髒數據。
(3) 一個讀取事務讀取一條數據時,另一個更新事務修改了這條數據,這時就會出現不可重現的讀取。
(4)一個讀取事務讀取時,另一個插入事務(注意此處時插入)插入了一條新數據,這樣就可能多讀出一條數據,出現幻讀。
以上四種情況描述完畢,相信大家也發現規律了,前三種是對同一條數據的併發操作,對程序的結果可能產生致命影響,尤其是金融等實時性,準確性要求極高的系統,絕不容許這三中情況的出現,
相比第四種情況不會影響數據的真實性,在很多情況下是允許的,如社交論壇等實時性要求不高的系統!
綜上四個情況,我們可以大致這樣簡單的理解(最初說的兩種事務的自由組合2*2=4):
A) 修改時允許修改(丟失更新)
B) 修改時允許讀取(髒讀)
C) 讀取時允許修改(不可重複讀)
D) 讀取時允許插入(幻讀)
從上到下問題越來越不嚴重,但所需的性能開銷卻越大。因爲不同的系統允許不同級別的情況,所以就出現了事務隔離這麼一個東東,來允許我們設定數據庫的併發行爲。

總結下如果不考慮事務的隔離性,會發生的幾種問題:

髒讀
  髒讀是指在一個事務處理過程裏讀取了另一個未提交的事務中的數據。
  當一個事務正在多次修改某個數據,而在這個事務中這多次的修改都還未提交,這時一個併發的事務來訪問該數據,就會造成兩個事務得到的數據不一致。例如:用戶A向用戶B轉賬100元,對應SQL命令如下
update account set money=money+100 where name=’B’; (此時A通知B)
update account set money=money - 100 where name=’A’;
  當只執行第一條SQL時,A通知B查看賬戶,B發現確實錢已到賬(此時即發生了髒讀),而之後無論第二條SQL是否執行,只要該事務不提交,則所有操作都將回滾,那麼當B以後再次查看賬戶時就會發現錢其實並沒有轉。

不可重複讀
  不可重複讀是指在對於數據庫中的某個數據,一個事務範圍內多次查詢卻返回了不同的數據值,這是由於在查詢間隔,被另一個事務修改並提交了。
  例如事務T1在讀取某一數據,而事務T2立馬修改了這個數據並且提交事務給數據庫,事務T1再次讀取該數據就得到了不同的結果,發送了不可重複讀。
  不可重複讀和髒讀的區別是,髒讀是某一事務讀取了另一個事務未提交的髒數據,而不可重複讀則是讀取了前一事務提交的數據。
  在某些情況下,不可重複讀並不是問題,比如我們多次查詢某個數據當然以最後查詢得到的結果爲主。但在另一些情況下就有可能發生問題,例如對於同一個數據A和B依次查詢就可能不同,A和B就可能打起來了……

虛讀(幻讀)
  幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中所有的行的某個數據項做了從“1”修改爲“2”的操作,這時事務T2又對這個表中插入了一行數據項,而這個數據項的數值還是爲“1”並且提交給數據庫。而操作事務T1的用戶如果再查看剛剛修改的數據,會發現還有一行沒有修改,其實這行是從事務T2中添加的,就好像產生幻覺一樣,這就是發生了幻讀。
  幻讀和不可重複讀都是讀取了另一條已經提交的事務(這點就髒讀不同),所不同的是不可重複讀查詢的都是同一個數據項,而幻讀針對的是一批數據整體(比如數據的個數)。

SQL標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低級別的隔離級一般支持更高的併發處理,並擁有更低的系統開銷。

MySQL數據庫的四種事務隔離級別

Read Uncommitted(讀取未提交內容)

   在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因爲它的性能也不比其他級別好多少。讀取未提交的數據,也被稱之爲髒讀(Dirty Read);

Read Committed(讀取提交內容

   這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別 也支持所謂的不可重複讀(Nonrepeatable Read),因爲同一事務的其他實例在該實例處理其間可能會有新的commit,所以同一select可能返回不同結果;

Repeatable Read(可重讀)

   這是MySQL的默認事務隔離級別,它確保同一事務的多個實例在併發讀取數據時,會看到同樣的數據行。不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)。
   簡單的說,幻讀指當用戶讀取某一範圍的數據行時,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的數據行時,會發現有新的“幻影” 行。
   InnoDB和Falcon存儲引擎通過多版本併發控制(MVCC,Multiversion Concurrency Control)機制解決了該問題

Serializable(可串行化)

   這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的數據行上加上共享鎖。在這個級別,可能導致大量的超時現象和鎖競爭。
     這四種隔離級別採取不同的鎖類型來實現,若讀取的是同一個數據的話,就容易發生問題。例如:

     髒讀(Drity Read):某個事務已更新一份數據,另一個事務在此時讀取了同一份數據,由於某些原因,前一個RollBack了操作,則後一個事務所讀取的數據就會是不正確的。
     不可重複讀(Non-repeatable read):在一個事務的兩次查詢之中數據不一致,這可能是兩次查詢過程中間插入了一個事務更新的原有的數據。
     幻讀(Phantom Read):在一個事務的兩次查詢中數據筆數不一致,例如有一個事務查詢了幾列(Row)數據,而另一個事務卻在此時插入了新的幾列數據,先前的事務在接下來的查詢中,就會發現有幾列數據是它先前所沒有的。

Mysql操作事務

默認情況下Mysql的事務是自動提交的,之前我們用SQL操作數據庫時,一條數據執行後
系統胡自動執行事務提交。當需要一組語句作爲一個事務提交時,需要手動對事務進行控制。
手動控制事務有兩種方法,一種是使用事務處理命令控制,另一種是使用set設置事務的處理方式
使用事務命令控制事務(3個命令)
begin:表示開始一個事務,後面會有多條數據庫操作語句執行
commit:表示提交一個事務,對應前面的begin操作,它們之間的數據庫操作語句一起完成
rollback:表示回滾一個事務,再begin和commit之間,如果某一個數據庫的操作語句出現錯誤
執行rollback回滾,數據庫回到begin之前的狀態,也就是操作語句都沒執行。

前面我們瞭解了原理,下面我們開始實驗

mysql操作事務命令實驗

這是之前的數據表
mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
+----+----------+----------+-----+
2 rows in set (0.01 sec)

mysql> insert into info (name,address,age) values ('wangwu','hangzhou',30);
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 |
+----+----------+----------+-----+
3 rows in set (0.00 sec)

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,下次我們可以回滾到標記a
Query OK, 0 rows affected (0.00 sec)

mysql> insert into info (name,address,age) values ('tianqi','hangzhou',33); #我們再加一條數據
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 ('heipa','hangzhou',35); #再加一條數據
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 |  33 |
|  6 | heipa    | hangzhou |  35 |

我們再開一臺終端去查看info數據表中有沒有數據

[root@localhost ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.20 Source distribution

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> use schol;
ERROR 1049 (42000): Unknown database 'schol'
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> 
mysql> 
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| hob              |
| info             |
| user             |
| view_user        |
+------------------+
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 |
+----+----------+----------+-----+
3 rows in set (0.00 sec)

回滾到b沒有添加heiba的時候

mysql> rollback to 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 |  33 |
+----+----------+----------+-----+
5 rows in set (0.00 sec)

回滾到a的沒有tianqi的時候

mysql> rollback to a;
Query OK, 0 rows affected (0.01 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)

這時候我們在回滾到b,錯誤,之前我們的已經存放在內存的已經釋放掉了,就回不去了

mysql> rollback to b;
ERROR 1305 (42000): SAVEPOINT b does not exist

#我們再插一行數據進去,再試試回滾。
mysql> insert into info (name,address,age) values ('zhaoliu','hangzhou',31);
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 |
|  7 | 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 |
|  7 | zhaoliu  | hangzhou |  31 |
+----+----------+----------+-----+
4 rows in set (0.00 sec)

我們以另一個終端爲基準,我們發現zhaoliu這行數據被寫進去了

我們只要執行rollback,而不是回滾到一個節點,都視爲提交事務了

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

我們回到第一個終端再插一行數據進去

mysql> insert into info (name,address,age) values ('tianqi','hangzhou',33);
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 | zhaoliu  | hangzhou |  31 |
|  8 | tianqi   | hangzhou |  33 |
+----+----------+----------+-----+
5 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='tianqi'; #把tianqi的address修改成beijing
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 | zhaoliu  | hangzhou |  31 |
|  8 | tianqi   | hangzhou |  33 |
+----+----------+----------+-----+
5 rows in set (0.00 sec)

我們回到第一臺終端開啓自動提交

mysql> set autocommit=1;
Query OK, 0 rows affected (0.01 sec)

再到另一臺終端驗證是不是修改了

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hangzhou |  30 |
|  7 | zhaoliu  | hangzhou |  31 |
|  8 | tianqi   | beijing  |  33 |
+----+----------+----------+-----+
5 rows in set (0.00 sec)

存儲引擎

存儲引擎概念介紹

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

mysql事務

MyISQM的介紹

ISAM的特點:
ISAM執行讀取操作的速度很快
而且不佔用大量的內存和存儲資源
他不支持事務處理
不能夠容錯
MyISAM的特點:
不支持事務
表級鎖定形式,數據在更新時鎖定整個表
數據庫在讀寫過程中相互阻塞
●會在數據寫入的過程阻塞用戶數據的讀取
●也會在數據讀取的過程中阻塞用戶的數據寫入
可通過key_buffer_size來設置緩存索引,提高訪問性能,減少磁盤IO的壓力
●但緩存只會緩存索引文件,不會緩存數據
採用MyISAM存儲引擎數據單獨寫入或讀取,速度過程較快且佔用資源相對少
MyISAM存儲引擎它不支持外鍵約束,只支持全文索引
每個MyISAM在磁盤.上存儲成三個文件,每- -個文件的名字以表的名字開始,擴展名指出文件類型
MyISAM在磁盤.上存儲的文件

●.frm文件存儲表定義

●數據文件的擴展名爲.MYD (MYData)
●索引文件的擴展名是.MYI (MYIndex)
MyISAM適用的生產場景舉例
公司業務不需要事務的支持
一般單方面讀取數據比較多的業務,或單方面寫入數據比較多的業務
MyISAM存儲引擎數據讀寫都比較頻繁場景不適合
使用讀寫併發訪問相對較低的業務
數據修改相對較少的業務
對數據業務一致性要求不是非常高的業務
服務器硬件資源相對比較差

InnoDB特點介紹

支持事務:支持4個事務隔離級別
行級鎖定,但是全表掃描仍然會是表級鎖定
讀寫阻塞與事務隔離級別相關
具有非常高效的緩存特性:能緩存索引,也能緩存數據
表與主鍵以簇的方式存儲
支持分區、表空間,類似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> show engines; #查看系統默認的存儲引擎
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

mysql> show create table info; #查看info這張表,存儲引擎是默認InnoDB
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                           |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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=9 DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> quit
Bye

想以後創建的每一張表都是MyISAM存儲引擎,就到配置文件裏改。

[root@localhost ~]# vim /etc/my.cnf  #進入數據庫主配置文件

default-storage-engine=Myisam  #添加Myisam的存儲引擎
[root@localhost ~]# mysql -u root -p 進入數據庫
mysql> use school; #進入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;  #查看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;
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table a;
+-------+-------------------------------------------------------------------------------------+
| Table | Create Table                                                                        |
+-------+-------------------------------------------------------------------------------------+
| a     | CREATE TABLE "a" (
  "id" int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

以上就是我們全部的內容,謝謝收看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章