真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析

這篇文章主要講解了“MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析”吧!

創(chuàng)新互聯(lián)主營同安網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā),同安h5微信小程序搭建,同安網(wǎng)站營銷推廣歡迎同安等地區(qū)企業(yè)咨詢

衡量指標(biāo)

TPS

Transactions Per Second(每秒傳輸?shù)绞聞?wù)處理個數(shù)),這里是指服務(wù)器每秒處理事務(wù)數(shù),支持事務(wù)的存儲引擎如InnoDB等特有等一個性能指標(biāo)。單位時間內(nèi)事務(wù)執(zhí)行成功跟事務(wù)回滾數(shù)
TPS= (COM_COMMIT + COM_ROLLBACK)/UPTIME

QPS

Queries Per Second(每秒查詢處理量),同時適用于InnoDB跟MyISAM引擎。
QPS= QUESTIONS/UPTIME
等待時間:執(zhí)行SQL等待返回結(jié)果之間的等待時間。

順序

MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析

MySqlSlap

在mysql5.1.4以后的版本官方就提供了壓力測試工具。

  • 創(chuàng)建schema,table,testdata。

  • 運行負(fù)載測試,可以使用多個并發(fā)客戶端連接。

  • 測試環(huán)境的清理(刪除創(chuàng)建的數(shù)據(jù),表格,斷開連接)

想要看詳細的信息可以 man mysqlslap 或者使用 mysqlslap –help 查看

指令含義
–concurrency并發(fā)數(shù)量,多個可以用逗號隔開
–engines要測試的引擎,可以有多個,用分隔符隔開,如engines=myisam,innodb
–iterations要運行這些測試多少次
–auto-generate-sql用系統(tǒng)自己生成的SQL腳本來測試
–auto-generate-sql-load-type要測試的是讀還是寫還是兩者混合的(read,write,update,mixed)
–number-of-queries總共要運行多少次查詢。每個客戶運行的查詢數(shù)量可以用查詢總數(shù)/并發(fā)數(shù)來計算
–debug-info額外輸出CPU以及內(nèi)存的相關(guān)信息
–number-int-cols創(chuàng)建測試表的int型字段數(shù)量
–number-char-cols創(chuàng)建測試表的chat型字段數(shù)量
–create-schema測試的database
–query 自己的SQL腳本執(zhí)行測試
–only-print如果只想打印看看SQL語句是什么,可以用這個選項

幾個demo如下:

  1. mysqlslap -umysql -p123 --concurrency=100 --iterations=1 --auto-generate-sql --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --engine=myisam --number-of-queries=10 --debug-info

  2. mysqlslap -h292.168.3.18 -P4040 --concurrency=100 --iterations=1 --create-schema=‘test’ --query=‘select * from test;’ --number-of-queries=10 --debug-info -umysql -p123

  3. mysqlslap -uroot -p123456 --concurrency=100 --iterations=1 --engine=myisam --create-schema=‘haodingdan112’ --query=‘select * From order_boxing_transit where id = 10’ --number-of-queries=1 --debug-info

MySQL 架構(gòu)圖

MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析

連接層1

當(dāng)MySQL啟動(mysql服務(wù)器就是一個進程),等待客戶端鏈接,每一個客戶端的鏈接請求。 每一個客戶端連接請求服務(wù)器都會新建一個線程進行處理(如果服務(wù)器端是線程池,則由線程池來分配一個空閑線程),每哥線程都是獨立的,擁有自己獨立的內(nèi)存空間,如果這個請求是查詢,沒關(guān)系。但是若是修改則兩個線程修改同一個內(nèi)存會引發(fā)數(shù)據(jù)同步問題,需要引入鎖。

MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析

連接層2

客戶連接到服務(wù)器,服務(wù)器也要對客戶進行驗證,也就是用戶名,IP,密碼,來確定是否可以連接,連接后還要確定是否有執(zhí)行某個特殊查詢等權(quán)限,比如讀寫或指定的table。
MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析

引擎層

這一層重要功能是:SQL語句的解析,優(yōu)化,緩存(緩存查詢過的數(shù)據(jù),緩存執(zhí)行過的SQL)的查詢。
MySQL的內(nèi)置函數(shù)實現(xiàn),跨存儲引擎功能(所謂的跨存儲引擎就是每個引擎都需要提供的功能(引擎需要對外提供結(jié)構(gòu)))。比如存儲過程,觸發(fā)器,視圖等。

  1. 如果是查詢語句比如select,會先查詢緩存是否已經(jīng)有對應(yīng)結(jié)果,有則返回,沒有則進行下一步查詢。

  2. 解析查詢,創(chuàng)建一個內(nèi)部數(shù)據(jù)結(jié)構(gòu)形式等解析樹,解析樹主要用來SQL語句等語義跟語法縫隙。

  3. 優(yōu)化:優(yōu)化SQL語句,例如重寫查詢,決定表的讀取順序,以及選擇需要的索引等,用戶可以進行查詢此階段,看到服務(wù)器如何進行優(yōu)化的,還會涉及到存儲引擎,比如某個操作開銷信息,是否對特定索引有查詢優(yōu)化。

查詢是否開啟緩存

show variables like '%query_cache_type%'

設(shè)定緩存大小

set Global query_cache_size = 4000;

查看數(shù)據(jù)保存目錄

show variables like '%datadir%'

MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析

解析查詢

MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析
MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析

存儲層

將數(shù)據(jù)存儲于裸設(shè)備的文件系統(tǒng)之上,完成與存儲引擎的交互。

MySQL形象圖

MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析

MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析

存儲引擎

查詢mysql以提供對存儲引擎;

show engines

MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析
查看你對mysql默認(rèn)存儲引擎

show variables like '%storage_engine%'

MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析

重點MyISAM

MySQL5.5之前對默認(rèn)存儲引擎,MyISAM存儲引擎由

table.MYD: 存儲數(shù)據(jù)
talbe.MYI:存儲索引
talbe.frm: 存儲表格式(InnoDB也有)

特性:

  1. 并發(fā)性與鎖級別-表級鎖,不支持事務(wù),不適合頻繁修改。

  2. 支持全文檢索

  3. 支持?jǐn)?shù)據(jù)壓縮 myisampack -b -f table.MYI
    使用場景:

  • 非事務(wù)型應(yīng)用(數(shù)據(jù)倉庫,報表,日志數(shù)據(jù))

  • 只讀類應(yīng)用

  • 空間類應(yīng)用(自帶空間函數(shù)跟坐標(biāo))

重點InnoDB

MySQL5.5以后版本默認(rèn)存儲引擎
存儲對適合有innodb_file_per_table 屬性

ON:獨立對表空間(table.frm,table.ibd)
OFF: 系統(tǒng)表空間(ibdataX)

MySQL5.6以前默認(rèn)為系統(tǒng)表空間,5.6以后建議跟默認(rèn)使用獨立表空間

  • 系統(tǒng)表空間無法簡單收縮文件大小

  • 獨立表空間可以通過 optimize table 收縮系統(tǒng)文件

  • 系統(tǒng)表空間存儲所有數(shù)據(jù),會產(chǎn)生IO瓶頸

  • 獨立表空間可以同時向多個文件刷新數(shù)據(jù)。

特性:

InnoDB 是一種事務(wù)性存儲引擎
完全支持事務(wù)的ACID特性
RedoLog和Undo Log
InnoDB支持行級鎖(并發(fā)成都更高)

使用場景:

InnoDB適合大多數(shù)的OLTP應(yīng)用(On-Line Transaction Processing聯(lián)機事務(wù)處理過程(OLTP),也稱為面向交易的處理過程)

存儲引擎對比

MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析

CSV

特點:

  1. 以csv格式進行數(shù)據(jù)存儲

  2. 所有列都不嫩為null

  3. 不支持索引(不適合大表,不適合在線處理)

  4. 可以直接手動對csv文件進行編輯(編輯適合記得回車,最后flush tables)

場景:

一般財務(wù)等人用

Archive

組成: 以zlib對表數(shù)據(jù)進行壓縮,磁盤IO更小,
特點:

  1. 只支持insert 跟select 語句

  2. 只允許在自增ID上建立索引

使用場景:

日志和數(shù)據(jù)的采集應(yīng)用

Memory

文件系統(tǒng)存儲特點,也成HEAP存儲引擎,數(shù)據(jù)保存內(nèi)存中,斷電則沒。
支持HASH索引跟BTree索引
所有字段都是孤獨長度varchar(10) = char(10)
不支持Blog跟Text等大字段
Memory存儲引擎使用表級索引
最大值由max_heap_table_size參數(shù)決定。

內(nèi)存表(Memory)跟臨時表(Memory)區(qū)別

內(nèi)存表,就是放在內(nèi)存中的表,所使用內(nèi)存的大小可通過My.cnf中的max_heap_table_size指定,如max_heap_table_size=1024M,內(nèi)存表與臨時表并不相同,臨時表也是存放在內(nèi)存中,臨時表最大所需內(nèi)存需要通過tmp_table_size =128M設(shè)定。當(dāng)數(shù)據(jù)超過臨時表的最大值設(shè)定時,自動轉(zhuǎn)為磁盤表,此時因需要進行IO操作,性能會大大下降,而內(nèi)存表不會,內(nèi)存表滿后,會提示數(shù)據(jù)滿錯誤
臨時表和內(nèi)存表都可以人工創(chuàng)建,但臨時表更多的作用是系統(tǒng)自己創(chuàng)建后,組織數(shù)據(jù)以提升性能,如子查詢,臨時表在多個連接之間不能共享。

Ferderated

默認(rèn)不開啟,需手動配置開啟。
特點:

  1. 提供遠程訪問MySQL服務(wù)器上表大方法

  2. 本地不存儲數(shù)據(jù),數(shù)據(jù)都在遠程服務(wù)器

  3. 本地需要保存表結(jié)構(gòu)和遠程服務(wù)器連接信息

場景:

偶爾大統(tǒng)計分析及手工查詢

多線程對同一對象進行操作需加鎖。

  1. 鎖鎖計算機協(xié)調(diào)多個進程或線程并發(fā)訪問某一個資源對機制

  2. 在數(shù)據(jù)庫中,數(shù)據(jù)也是一種提供給許多用戶的共享資源,如何保證數(shù)據(jù)并發(fā)訪問的一致性跟有效性是比解決問題,鎖沖突也是影響數(shù)據(jù)庫并發(fā)訪問性能的一個重要因素。

  3. 鎖對數(shù)據(jù)庫而言重要且復(fù)雜。

mysql中 鎖類型

  1. 表級鎖:開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。多查詢少修改應(yīng)用

  2. 行級鎖:開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。支持并發(fā)的查詢跟更新。

  3. 頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般。

MySQL鎖機制簡單,不同引擎默認(rèn)支持不同鎖級別,MyISAM支持表級鎖(table-level locking),InnoDB同時支持行級鎖(row-level locking)跟表級鎖,默認(rèn)行級鎖。

MySQL 的表級鎖有兩種模式:

表共享讀鎖(Table Read Lock)
表獨占寫鎖(Table Write Lock)
MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析
在mysql中加鎖是后臺自動優(yōu)化進行添加的,也可以人為的手動添加了解mysql底層特性。

MyISAM 鎖

MyISAM共享讀鎖及獨占寫鎖總結(jié):

  1. 對MyISAM表進行讀對時候,不會阻塞其他用戶對同一表對讀操作,但是會阻塞對同一個表對寫操作。

  2. 對MyISAM表對讀操作,不會阻塞當(dāng)前用戶讀表,當(dāng)對表進行修改也會保存。

  3. 一個session 使用LOCK table 給表加讀鎖,這個session可以進行增刪改查,當(dāng)時當(dāng)前session不可再訪問或更新其他表。

  4. 另外一個session可以查詢表對記錄,但是更新對時候就要等待。

  5. 對MyISAM表的寫操作,會阻塞其他用戶對同一表對讀寫操作。

  6. 對MyISAM表對寫操作,當(dāng)前session可以對表進行CRUD,但對其他表操作時候會報錯。

讀demo:

  1. lock table testmysam READ
    啟動另外一個session select * from testmysam 可以查詢

  2. insert into testmysam value(2); update testmysam set id=2 where id=1; 報錯
    3.在另外一個session中 insert into testmysam value(2); 等待
    4.在同一個session中 insert into testdemo value(2,‘2’,‘3’); 報錯 select * from testdemo ; 報錯
    5.在另外一個session中 insert into testdemo value(2,‘2’,‘3’); 成功
    6.加鎖在同一個session 中 select s.* from testmysam s 報錯
    lock table 表名 as 別名 read;
    查看 show status LIKE ‘table_locks_waited’ 表被鎖過幾次
    寫demo:
    1.lock table testmysam WRITE 在同一個session中 insert testmysam value(3) (OK) ; delete from testmysam where id = 3 (OK) ; select * from testmysam (NO)
    2.對不同的表操作(報錯) select s.* from testmysam s; insert into testdemo value(2,‘2’,‘3’);
    3.在其他session中 (等待) select * from testmysam

InnoDB 鎖

在MySQL的InnoDB引擎支持行鎖。

  1. 共享鎖(讀鎖),當(dāng)一個事務(wù)對某幾行上讀鎖時,允許其他事務(wù)對這幾行進行讀操作,當(dāng)時不允許對這幾行進行寫操作,也不允許其他事務(wù)給這幾行上排它鎖,但可以上讀鎖。

  2. 排它鎖(寫鎖),當(dāng)一個事務(wù)對幾行上寫鎖時,不允許其他事務(wù)寫,但允許讀。更不允許其他事務(wù)給這幾行上任何鎖,包括寫鎖。

語法:

上共享鎖寫法:lock in share mode

select * from 表 where 條件 lock in share mode;
上排它鎖寫法:for update
select * from 表 where 條件 for update;

InnoDB行鎖

  1. 兩個事務(wù)不能鎖同一個索引

  2. insert,delete,update在事務(wù)中自動加上排它鎖。

  3. 行鎖必須有索引才可實現(xiàn),否則自動鎖全表,那就不是行鎖

demo:

  1. BEGIN select * from testdemo where id =1 for update
    在另外一個session中 update testdemo set c1 = ‘1’ where id = 2 成功 update testdemo set c1 = ‘1’ where id = 1 等待

  2. BEGIN update testdemo set c1 = ‘1’ where id = 1 在另外一個session中 update testdemo set c1 = ‘1’ where id = 1 等待

  3. BEGIN update testdemo set c1 = ‘1’ where c1 = ‘1’ 在另外一個session中 update testdemo set c1 = ‘2’ where c1 = ‘2’ 等待 c1 沒有索引。

InnoDB表鎖 跟MyISAM差別不大,但是開啟一個新事務(wù)時候會解鎖表。

延伸:系統(tǒng)允許一段時間,數(shù)據(jù)量大,系統(tǒng)升級,A表要添加字段,白天晚上并發(fā)量都大,如何修改表結(jié)構(gòu)。

  1. 創(chuàng)建一個跟A表一樣但信息是空的A1

  2. 修改A1的數(shù)據(jù),然后A數(shù)據(jù)copy 到A1里面

  3. 在A表中創(chuàng)建一個觸發(fā)器,將A表中新增數(shù)據(jù)自動全部更新到表中來。

  4. copy 完畢后自動rename即可。

上述步驟自動化實現(xiàn)可用 工具pt-online-schema-change

事務(wù)

MySQL 事務(wù)主要用于處理操作量大,復(fù)雜度高的數(shù)據(jù)。比如說,在人員管理系統(tǒng)中,你刪除一個人員,你既需要刪除人員的基本資料,也要刪除和該人員相關(guān)的信息,如信箱,文章等等,這樣,這些數(shù)據(jù)庫操作語句就構(gòu)成一個事務(wù)!
 隱式事務(wù):事務(wù)沒有明顯的開啟或者結(jié)束的標(biāo)志,在mysql中,默認(rèn)是開啟自動提交的。
查看數(shù)據(jù)庫下面是否支持事務(wù)

show engines

查看mysql當(dāng)前默認(rèn)存儲引擎

show variables like ‘%storage_engine%’

查看某個表的存儲引擎

show create table 表名

修改表存儲結(jié)構(gòu)

create table () type=InnoDB;
Alter table 表 type=InnoDB;

一般來說,事務(wù)是必須滿足4個條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨立性)、持久性(Durability)。

  1. 原子性:一個事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結(jié)束在中間某個環(huán)節(jié)。事務(wù)在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到事務(wù)開始前的狀態(tài),就像這個事務(wù)從來沒有執(zhí)行過一樣。

  2. 一致性:在事務(wù)開始之前和事務(wù)結(jié)束以后,。這表示寫入的資料必須完數(shù)據(jù)庫的完整性沒有被破壞全符合所有的預(yù)設(shè)規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫可以自發(fā)性地完成預(yù)定的工作。

  3. 隔離性:數(shù)據(jù)庫允許多個并發(fā)事務(wù)同時對其數(shù)據(jù)進行讀寫和修改的能力,隔離性可以防止多個事務(wù)并發(fā)執(zhí)行時由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。

  4. 持久性:事務(wù)處理結(jié)束后,對數(shù)據(jù)的的,即便系統(tǒng)修改就是永久故障也不會丟失。

重點:隔離性
在mysql下事務(wù)的隔離級別有四種且由低到高依次為Read uncommitted 、Read committed 、Repeatable read (默認(rèn))、Serializable ,這四個級別中的后三個級別可以逐個解決臟讀 、不可重復(fù)讀 、幻讀這幾類問題
MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析

  1. 臟讀: 事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾了,那么A讀取到到數(shù)據(jù)是臟數(shù)據(jù)。

  2. 不可重復(fù)讀,事務(wù)A多次讀取同一個數(shù)據(jù),事務(wù)B在事務(wù)A多次讀取讀過程中,對數(shù)據(jù)做了更新跟提交,導(dǎo)致事務(wù)A多次讀取同一個數(shù)據(jù)時結(jié)果不一致。側(cè)重修改。只要鎖住滿足條件等行即可。

  3. 幻讀:管理員小王將數(shù)據(jù)庫中學(xué)生成績按照分?jǐn)?shù)劃分為ABCDE級別,但是有人在執(zhí)行時候插入了一條具體分?jǐn)?shù),導(dǎo)致A修改后發(fā)現(xiàn)一條記錄沒有修改完畢,像發(fā)生幻覺一樣。側(cè)重與新增或刪除,要鎖表!

  1. read uncommitted 未提交讀
    所有事務(wù)都可以看到?jīng)]有提交事務(wù)的數(shù)據(jù)。性能最好,事務(wù)性幾乎么有

  2. read committed 提交讀
    可能會出現(xiàn)多次讀取不一樣哦!

  3. repeatable 重復(fù)讀
    同一個事務(wù)多個實例讀取數(shù)據(jù)時,必須等其他操作目前數(shù)據(jù)等事務(wù)完畢才可以進行,mysql默認(rèn)級別。

  4. Serializable可串行化
    強制的進行排序,在每個讀讀數(shù)據(jù)行上添加共享鎖。會導(dǎo)致大量超時現(xiàn)象和鎖競爭

至于如何避免看 上圖表格即可。不同的事務(wù)級別可以對于解決不同的問題。
事務(wù)用法:
1、用 BEGIN, ROLLBACK, COMMIT來實現(xiàn)

BEGIN 開始一個事務(wù)
ROLLBACK 事務(wù)回滾
COMMIT 事務(wù)確認(rèn)

2、直接用 SET 來改變 MySQL 的自動提交模式:

SET AUTOCOMMIT=0 禁止自動提交
SET AUTOCOMMIT=1 開啟自動提交 (系統(tǒng)默認(rèn))

業(yè)務(wù)設(shè)計

邏輯設(shè)計

范式設(shè)計
  1. 第一范式

第一范式就是屬性不可分割,每個字段都應(yīng)該是不可再拆分的

原子性。比如一個字段是姓名(NAME),在國內(nèi)的話通常理解都是姓名是一個不可再拆分的單位,這時候就符合第一范式;但是在國外的話還要分為FIRST NAME和LAST NAME,這時候姓名這個字段就是還可以拆分為更小的單位的字段,就不符合第一范式了。

  1. 第二大范式

表中要有主鍵,表中其他其他字段都依賴于主鍵

第二范式只要記住就好了。主鍵約束比如說有一個表是學(xué)生表,學(xué)生表中有一個值唯一的字段學(xué)號,那么學(xué)生表中的其他所有字段都可以根據(jù)這個學(xué)號字段去獲取,依賴主鍵的意思也就是相關(guān)的意思,因為學(xué)號的值是唯一的,因此就不會造成存儲的信息對不上的問題,即學(xué)生001的姓名不會存到學(xué)生002那里去。

  1. 第三范式

第三范式就是要求表中不能有其他表中存在的、存儲相同信息的字段,

通常實現(xiàn)是在通過外鍵去建立關(guān)聯(lián),因此第三范式只要記住外鍵約束就好了。比如說有一個表是學(xué)生表,學(xué)生表中有學(xué)號,姓名等字段,那如果要把他的系編號,系主任,系主任也存到這個學(xué)生表中,那就會造成數(shù)據(jù)大量的冗余,一是這些信息在系信息表中已存在,二是系中有1000個學(xué)生的話這些信息就要存1000遍。因此第三范式的做法是在學(xué)生表中增加一個系編號的字段(外鍵),與系信息表做關(guān)聯(lián)

范式化設(shè)計優(yōu)缺點

優(yōu)點:

可以盡量得減少數(shù)據(jù)冗余
范式化的更新操作比反范式化更快
范式化的表通常比反范式化的表更小

缺點:

對于查詢需要對多個表進行關(guān)聯(lián)
更難進行索引優(yōu)化

反范式設(shè)計

反范式化是針對范式化而言得,在前面介紹了數(shù)據(jù)庫設(shè)計得范式

所謂得反范式化就是為了性能和讀取效率得考慮而適當(dāng)?shù)脤?shù)據(jù)庫設(shè)計范式得要求進行違反
允許存在少量得冗余,換句話來說反范式化就是使用空間來換取時間

反范式化設(shè)計優(yōu)缺點

優(yōu)點:

可以減少表的關(guān)聯(lián)
可以更好的進行索引優(yōu)化

缺點:

存在數(shù)據(jù)冗余及數(shù)據(jù)維護異常
對數(shù)據(jù)的修改需要更多的成本

物理設(shè)計

根據(jù)所選擇的關(guān)系型數(shù)據(jù)庫的特點對邏輯模型進行存儲結(jié)構(gòu)的設(shè)計

命名規(guī)范
  • 數(shù)據(jù)庫、表、字段的命名要遵守可讀性原則
    使用大小寫來格式化的庫對象名字以獲得良好的可讀性
    例如:使用custAddress而不是custaddress來提高可讀性。

  • 數(shù)據(jù)庫、表、字段的命名要遵守表意性原則
    對象的名字應(yīng)該能夠描述它所表示的對象
    例如:對于表的名稱應(yīng)該能夠體現(xiàn)表中存儲的數(shù)據(jù)內(nèi)容;對于存儲過程存儲過程應(yīng)該能夠體現(xiàn)存儲過程的功能。

  • 數(shù)據(jù)庫、表、字段的命名要遵守長名原則
    盡可能少使用或者不使用縮寫

存儲引擎規(guī)范

根據(jù)業(yè)務(wù)規(guī)則選擇合適的存儲引擎,不同引擎的利弊也在面有講,工作中一般也就上InnoDB或者MyISAM。

數(shù)據(jù)類型規(guī)范

為表中字段選擇合適的字節(jié)類型,當(dāng)一個列可以選擇多種數(shù)據(jù)類型時

優(yōu)先考慮數(shù)字類型
其次是日期、時間類型
最后是字符類型
對于相同級別的數(shù)據(jù)類型,應(yīng)該優(yōu)先選擇占用空間小的數(shù)據(jù)類型

重點:

  1. 對于精度比較高的東西,比如money,用decimal類型,不會考慮float,double,因為他們?nèi)菀桩a(chǎn)生誤差。

  2. datetime 和 timestamp 的區(qū)別與選擇

timestamp 只占 4 個字節(jié),它會自動檢索當(dāng)前時區(qū)并進行轉(zhuǎn)換,不可存NULL。
datetime以 8 個字節(jié)儲存,不會進行時區(qū)的檢索,可存NULL

感謝各位的閱讀,以上就是“MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!


網(wǎng)頁標(biāo)題:MySQL架構(gòu)與存儲引擎,鎖,事務(wù),設(shè)計分析
網(wǎng)站鏈接:http://weahome.cn/article/ggispc.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部