- mysql邏輯結(jié)構(gòu)
從圖中可以看到MySQL由以下幾個部分組成
連接池
管理服務(wù)和工具組件
SQL接口
查詢分析器
優(yōu)化器
緩存
插入式存儲引擎
物理文件 - 物理結(jié)構(gòu):
mysql軟件(mysqld)+配置文件+mysql數(shù)據(jù)文件(磁盤上的文件:datadir)
邏輯的架構(gòu):
mysql架構(gòu)
實例(mysqld_process)+memory+datadir
整體結(jié)構(gòu):
物理+邏輯(實例)=mysql
數(shù)據(jù)庫 --理解為磁盤上面的文件
實例 --運行中mysqld+memory
mysql中是一個實例對應(yīng)多個物理庫
存儲引擎
引擎(Engine)是電子平臺上開發(fā)程序或系統(tǒng)的核心組件魁莉。利用引擎,開發(fā)者可迅速建立攒砖、鋪設(shè)程序所需的功能法褥,或利用其輔助程序的運轉(zhuǎn)检吆。一般而言薪捍,引擎是一個程序或一套系統(tǒng)的支持部分币他。常見的程序引擎有游戲引擎尔当、搜索引擎莲祸、殺毒引擎.數(shù)據(jù)庫引擎等。
把游戲的引擎比作賽車的引擎椭迎。引擎是賽車的心臟锐帜,決定著賽車的性能和穩(wěn)定性,賽車的速度畜号、操縱感這些直接與車手相關(guān)的指標(biāo)都是建立在引擎的基礎(chǔ)上的缴阎。游戲也是如此,玩家所體驗到的劇情简软、關(guān)卡蛮拔、美工述暂、音樂、操作等內(nèi)容都是由游戲的引擎直接控制的建炫,它扮演著中場發(fā)動機的角色畦韭,把游戲中的所有元素捆綁在一起,在后臺指揮它們同時肛跌、有序地工作艺配。簡單地說,引擎就是“用于控制所有游戲功能的主程序衍慎,從計算碰撞转唉、物理系統(tǒng)和物體的相對位置,到接受玩家的輸入稳捆,以及按照正確的音量輸出聲音等等赠法。”
存儲引擎就是指表的類型以及表在計算機上的存儲方式眷柔。
mysql存儲引擎有很多但是最常用的肯定是innoDB引擎,從5.5.5開始默認(rèn)的mysql存儲引擎就是InnoDB
- innoDB存儲引擎簡介
除了MyISAM外期虾,使用最為廣泛的存儲引擎,由第三方公司開發(fā)驯嘱,和mysql遵守相同的開源許可協(xié)議镶苞。
支持事務(wù)安全
數(shù)據(jù)多版本讀取
鎖定機制的改進(jìn)
實現(xiàn)外鍵
它有表空間的概念,但與oracle表空間相比又有較大的不同鞠评,首先茂蚓,innodb的表空間分為兩種形式,一種是共享表空間剃幌,也就是所有數(shù)據(jù)都被存放在同一個表空間(一個或多個數(shù)據(jù)文件)中聋涨,通過innodb_data_file_path來指定,增加數(shù)據(jù)文件須要停機重啟负乡。另外一種是獨享表空間牍白,也就是每個表的數(shù)據(jù)和索引都存放在一個單獨的.ibd文件中。
事務(wù)的4個特性(commit/rollback):
1抖棘、數(shù)據(jù)完整性 事務(wù)完成之后茂腥,它對于數(shù)據(jù)的修改是永久性的,即使出現(xiàn)系統(tǒng)故障也能夠保持
2切省、一致性 在事務(wù)開始和完成時最岗,數(shù)據(jù)都必須保持一致狀態(tài)。這意味著所有相關(guān)的數(shù)據(jù)規(guī)則都必須應(yīng)用于事務(wù)的修改朝捆,以保持?jǐn)?shù)據(jù)的完整性般渡;事務(wù)結(jié)束時,所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(如B樹索引或雙向鏈表)也都必須是正確的。
3驯用、隔離性 數(shù)據(jù)庫系統(tǒng)提供一定的隔離機制脸秽,保證事務(wù)在不受外部并發(fā)操作影響的“獨立”環(huán)境執(zhí)行。這意味著事務(wù)處理過程中的中間狀態(tài)對外部是不可見的晨汹,反之亦然豹储。
4、原子性 事務(wù)是一個原子操作單元淘这,其對數(shù)據(jù)的修改剥扣,要么全都執(zhí)行,要么全都不執(zhí)行
- 查看存儲引擎命令
mysql> show variables like '%storage%'; --查詢當(dāng)前mysql支持的儲存引擎
+----------------+--------+
| Variable_name | Value |
+----------------+--------+
| storage_engine | MyISAM |
+----------------+--------+
1 row in set (0.00 sec)
mysql> show engines; -查詢當(dāng)前庫中支持存儲引擎
- 更改默認(rèn)的存儲引擎
# vim /data2/my.cnf --靜態(tài)修改
default-storage-engine=innodb
#重啟mysql
/etc/init.d/mysqld stop
/etc/init.d/mysqld start
- 測試innodb事務(wù):
事務(wù)的4個特性(commit/rollback):
1铝穷、數(shù)據(jù)完整性
2钠怯、一致性
3、隔離性
4曙聂、原子性
innodb與myisam的區(qū)別
mysql> use aaaa;
mysql> create table t1(id int) engine=myisam; #設(shè)置t1表格為Myisam引擎
mysql> create table t2(id int);
mysql> create table t3(id int);
關(guān)閉自動提交功能
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.01 sec)
mysql> set session autocommit=off; #關(guān)閉自動提交功能
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t2 set id=1;
Query OK, 1 row affected (0.00 sec)
事務(wù)有隔離性 晦炊,
mysql> commit; 提交
Query OK, 0 rows affected (0.04 sec)
不提交 看不到
-
回滾
-
innodb數(shù)據(jù)存儲的方式
總結(jié):
在上圖中可以看到數(shù)據(jù)先到buffer_pool(緩存池中)當(dāng)我們commit的時候才會保存到硬盤當(dāng)中,也就是說如果數(shù)據(jù)在保存到磁盤成功之后才算一個事務(wù)完成 innodb存儲引擎的配置參數(shù)
innodb存儲引擎的配置參數(shù):
innodb_buffer_pool_size = 2G --innodb的數(shù)據(jù)緩沖大小(索引+數(shù)據(jù))宁脊,一般是物理的%50-%80
innodb_max_dirty_pages_pct = 90 --緩沖區(qū)的臟塊達(dá)到90%寫回磁盤
innodb_flush_log_at_trx_commit = 1 --1時只要commit會強制把事務(wù)日志寫回磁盤断国,0時只要commit把日志寫至操作系統(tǒng)緩沖區(qū),等待操作寫盤榆苞,2時當(dāng)commit延遲1秒寫出回磁盤
innodb_log_buffer_size = 8M --事務(wù)日志文件的緩沖大小
innodb_data_file_path = ibdata1:100M:autoextend --innodb數(shù)據(jù)文件
innodb_log_file_size = 256M --日志文件大小
innodb_log_files_in_group = 3 --有三組日志
innodb_data_home_dir =/abc --數(shù)據(jù)文件存儲的根目錄稳衬,不寫路徑默認(rèn)存儲在datadir中
innodb_log_group_home_dir= --事務(wù)日志的存儲根目錄