本人學習mysql的時候感受筆記有點散因此本身作了一個整合,並且有些概念介紹的太官方了,因此本身根據理解總結了一下。(有不對的請指點!)mysql
mysql:程序員
sql:關係型數據庫:(複雜的關係形數據庫)。sql
nosql:非關係型數據庫:(儲存的格式很簡單)數據庫
key,value(memcached),user1:1,user2:2(存在內存裏)安全
事務:一組原子性的SQL查詢,或者是一個或多個sql語句組成的獨立工做單元;操做要麼都執行,要麼都不執行,它是一個不可分割的工做單位。bash
事務的特性:併發
(1)原子性(Atomicity):強調事務是一個總體,要麼都執行,要不都不執行。nosql
(2)一致性(Consistency):事務執行的結果必須是使數據庫從一個一致性狀態變到另外一個一致性狀態,強調數據的一致性。ide
(3) 隔離性(Isolation):指併發的事務是相互隔離的。即一個事務內部的操做及正在操做的數據必須封鎖起來,不被企圖進行修改的事務看到。memcached
(4)持久性(Durability):意味着當系統或介質發生故障時,確保已提交事務的更新不能丟失。
不考慮事務隔離性會引起的四個問題:
(1)髒讀:一個事務讀到另外一個事務未提交的數據(就是數據不統一)。
說明:有兩個用戶a和b在使用同一個數據庫A,a用戶修改數據庫數據但還未提交,這時候用戶b仍是能讀取a用戶沒修改前的數據這就是髒讀。
(2)不可重複讀:一個事務讀到另外一個事務已提交的數據,強調Update(更新)。
說明:有一個學生信息表,裏面有一條數據[小明 男 25歲];事務1如今讀取這個條數據,將「小明」修改成「張三」,可是尚未提交到數據庫中;這個時候事務2來進行對這條數據的操做,事務2須要兩次讀取這條數據,事務2第一次讀取數據是在事務1尚未提交的時候,讀出的數據依然是[小明 男 25歲],可是事務2在第二次讀取的時候,小明已經提交了,這個時候一樣的讀取操做結果確實[張三 男 25歲],事務2兩次讀取的結果不一致,這就是不可重複讀問題。
(3)虛度/幻讀:一個事務讀到另外一個事務已提交的數據,強調Insert。
(4)丟失更新: 兩個事務同時修改數據,後提交事務覆蓋了先提交事務的結果。
說明:從字面上理解就好了,就是前一個修改的數據丟失了。
事物的隔離級別:四個
ISOLATION_DEFAULT:使用數據庫默認的隔離級別。
ISOLATION_SERIALIZABLE:徹底服從ACID的原則,確保不發生髒讀、不可重複讀和幻讀。
ISOLATION_REPEATABLE_READ:對相同字段的屢次讀取結果一致(不能夠重複度),不發生髒讀,可致使幻讀。
ISOLATION_READ COMMITTED:容許併發事務提交以後讀取,能夠避免髒讀,可能致使重複讀和幻讀。
ISOLATION_READ_UNCOMMITTED:容許讀取改變了的還未提交的數據,可能致使髒讀、不可重複讀和幻讀(等級最低)。
##我的感受了解兩款主流的引擎是頗有必要的,對數據庫操做和理解就頗有幫助。
主流引擎區別:
INNODB:支持事務處理與外鍵和行級鎖,不支持全文索引,能夠作回滾以及系統崩潰修復能力。(生產環境確定使用這款,由於安全性比較高。)InnoDB的AUTOCOMMIT默認是打開的,即每條SQL語句會默認被封裝成一個事務,自動提交,這樣會影響速度,因此最好是把多條SQL語句顯示放在begin和commit之間,組成一個事務去提交。主鍵範圍更大,最大是MyISAM的2倍
MYISAM:讀取的性能高,可是不支持事物,出錯了,就不能回滾回來了。不支持行鎖定,只支持鎖定整個表。即MyISAM同一個表上的讀鎖和寫鎖是互斥的,MyISAM併發讀寫時若是等待隊列中既有讀請求又有寫請求,默認寫請求的優先級高,即便讀請求先到,因此MyISAM不適合於有大量查詢和修改並存的狀況,那樣查詢進程會長時間阻塞。由於MyISAM是鎖表,因此某項讀操做比較耗時會使其餘寫進程餓死。
日誌管理:
二進制日誌:mysqldump備份還原。
錯誤日誌:查看mysql服務的錯誤日誌。
慢查詢日誌:查看慢查詢的日誌。
通用查詢日誌:線上不提倡開啓,io會太高。
注意:不能添加太多索引由於這樣會使得寫入的時候會變慢,因此通常使用的是聯合索引。
Mysql語言例子:
插入單個數據:
Mysql> INSERT INTO cml(I d,`name`) VALUE(1,'cml');
插入多個數據:
Mysql> INSERT INTO cml(id,`name`)VALUE(2,'zhangfei'),(3,'zhaoyun');
查看數據:
Mysql> SELECT * FROM cml; +----+----------+ | id | name | +----+----------+ | 1 | cml | | 2 | zhangfei | | 3 | zhaoyun | +----+----------+
建議程序員寫查詢的時候:
Mysql> SELECT id,name FROM cml; +----+----------+ | id | name | +----+----------+ | 1 | cml | | 2 | zhangfei | | 3 | zhaoyun | +----+----------+
加條件的查看:
Mysql> SELECT id,name FROM cml WHERE id=3; +----+---------+ | id | name | +----+---------+ | 3 | zhaoyun | +----+---------+
Mysql> SELECT * FROM cml LIMIT 1; +----+---------+ | id | name | +----+---------+ | 1 | cml |
Mysql> SELECT * FROM cml ORDER BY id DESC LIMIT 1; +----+---------+ | id | name | +----+---------+ | 3 | zhaoyun | +----+---------+
四、更新字段的值:
Mysql> UPDATE cml set name='guanyu' where id=1; Query OK, 1 rowaffected (0.00 sec) Rows matched:1 Changed: 1 Warnings: 0
五、刪除id=1的值
Mysql> DELETE FROM cml WHERE id=2; Query OK, 1 rowaffected (0.00 sec)
六、DELETE 刪除的時候計數器沒有被清空:
Mysql> DELETE FROM cml; Query OK, 2 rowsaffected (0.00 sec) Mysql> select * FROM cml; Empty set (0.00sec) Mysql> INSERT INTO cml(`name`) VALUE('machao'); Query OK, 1 rowaffected (0.00 sec) Mysql> select * FROM cml; +----+--------+ | id | name | +----+--------+ | 4 | machao | +----+--------+
七、把表結構ID修改id自動增加,而後插入數據:
Mysql> CREATE TABLE `cml` ( `id` int(11) NOT NULLAUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ); Mysql> INSERT INTO cml(`name`) VALUE('zhangfei'); Query OK, 1 rowaffected (0.00 sec) 八、清空計數器: Mysql> TRUNCATE cml; Query OK, 0 rowsaffected (0.00 sec) Mysql> INSERT INTO cml(`name`) VALUE('machao'); Query OK, 1 rowaffected (0.00 sec) Mysql> select * FROM cml; +----+--------+ | id | name | +----+--------+ | 1 | machao | +----+--------+ 1 row in set(0.00 sec)
九、插入測試數據:
Mysql> CREATE TABLE `cml` ( `id` int(11)AUTO_INCREMENT, `name` varchar(20) , age int, PRIMARY KEY (`id`) ); Query OK, 0 rowsaffected (0.00 sec) Mysql> INSERT INTO cmlVALUE(1,'zhangfei',20),(2,'zhaoyun',25),(3,'machao',30); Query OK, 3 rowsaffected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0 Mysql> select * from cml; +----+----------+------+ | id | name | age | +----+----------+------+ | 1 | zhangfei | 20 | | 2 | zhaoyun | 25 | | 3 | machao | 30 | Mysql> SELECT name FROM cml WHERE age>25; +--------+ | name | +--------+ | machao | +--------+ Mysql> SELECT name FROM cml WHERE age>25 ANDage<=30; +--------+ | name | +--------+ | machao |
按照年齡排序:
Mysql> SELECT * FROM cml ORDER BY age; +----+----------+------+ | id | name | age | +----+----------+------+ | 4 | wanggai | 18 | | 1 | zhangfei | 20 | | 2 | zhaoyun | 25 | | 3 | machao | 30 | +----+----------+------+
獨立表空間:
優勢:
每一個表都有自已獨立的表空間。
每一個表的數據和索引都會存在自已的表空間中。
能夠實現單表在不一樣的數據庫中移動。
空間能夠回收(除drop table操做處,表空不能自已回收)
1、Drop table操做自動回收表空間,若是對於統計分析或是日值表,刪除大量數據後能夠 經過:alter table TableName engine=innodb;回縮不用的空間。
2、對於使innodb-plugin的Innodb使用turncate table也會使空間收縮。
3、對於使用獨立表空間的表,無論怎麼刪除,表空間的碎片不會太嚴重的影響性能,並且 還有機會處理。
缺點:
單表增長過大,如超過100個G。
結論
共享表空間在Insert操做上少有優點。其它都沒獨立表空間表現好。當啓用獨立表空間時,請合理調整一下:innodb_open_files 。InnoDB Hot Backup(冷備)的表空間cp不會面對不少無用的copy了。並且利用innodb hot backup及表空間的管理命令能夠實現單現移動。
innodb_file_per_table設置.
開啓方法:
在my.cnf中[mysqld]下設置
innodb_file_per_table=1
查看是否開啓:
mysql> show variables like'%per_table%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+ 1 row in set (0.02 sec)
關閉獨享表空間:
innodb_file_per_table=0
關閉獨立的表空間
mysql> show variables like'%per_table%'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | OFF | +-----------------------+-------+ 1 row in set (0.01 sec)