外鍵約束
刪除吕漂,更新時(shí)的四個(gè)選項(xiàng)
- RESTRICT 當(dāng)有關(guān)聯(lián)數(shù)據(jù)時(shí)贾陷,無(wú)法刪除(立即檢出)
- NO ACTION 當(dāng)有關(guān)聯(lián)數(shù)據(jù)時(shí)队橙,無(wú)法刪除(延遲檢查)
- CASCADE 級(jí)聯(lián)的更新候味,父親的id變了孩子的f_id也會(huì)變
- SETNULL 刪除父親時(shí)抒寂,把兒子變?yōu)閚ull
事務(wù)
數(shù)據(jù)庫(kù)事務(wù)的四個(gè)特性及含義
數(shù)據(jù)庫(kù)事務(wù)transanction正確執(zhí)行的四個(gè)基本要素傲茄。ACID,原子性(Atomicity)毅访、一致性(Correspondence)、隔離性(Isolation)盘榨、持久性(Durability)喻粹。
- 原子性:整個(gè)事務(wù)中的所有操作,要么全部完成草巡,要么全部不完成守呜,不可能停滯在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被回滾(Rollback)到事務(wù)開(kāi)始前的狀態(tài)弛饭,就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣冕末。
- 一致性:在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性約束沒(méi)有被破壞侣颂。
- 隔離性:隔離狀態(tài)執(zhí)行事務(wù)档桃,使它們好像是系統(tǒng)在給定時(shí)間內(nèi)執(zhí)行的唯一操作。如果有兩個(gè)事務(wù)憔晒,運(yùn)行在相同的時(shí)間內(nèi)藻肄,執(zhí)行 相同的功能,事務(wù)的隔離性將確保每一事務(wù)在系統(tǒng)中認(rèn)為只有該事務(wù)在使用系統(tǒng)拒担。這種屬性有時(shí)稱為串行化嘹屯,為了防止事務(wù)操作間的混淆,必須串行化或序列化請(qǐng) 求从撼,使得在同一時(shí)間僅有一個(gè)請(qǐng)求用于同一數(shù)據(jù)州弟。
- 持久性:在事務(wù)完成以后,該事務(wù)所對(duì)數(shù)據(jù)庫(kù)所作的更改便持久的保存在數(shù)據(jù)庫(kù)之中低零,并不會(huì)被回滾婆翔。
MySQL中InnoDB支持的四種事務(wù)隔離級(jí)別
- read uncommited:讀取未提交內(nèi)容
- read committed:讀取提交內(nèi)容
- repeatable read:可重讀
- serializable:可串行化
read Uncommitted(讀取未提交內(nèi)容)
在該隔離級(jí)別,所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果掏婶。本隔離級(jí)別很少用于實(shí)際應(yīng)用啃奴,因?yàn)樗男阅芤膊槐绕渌?jí)別好多少。讀取未提交的數(shù)據(jù)雄妥,也被稱之為臟讀(Dirty Read)最蕾。
Read Committed(讀取提交內(nèi)容)
這是大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)的默認(rèn)隔離級(jí)別(但不是MySQL默認(rèn)的)。它滿足了隔離的簡(jiǎn)單定義:一個(gè)事務(wù)只能看見(jiàn)已經(jīng)提交事務(wù)所做的改變老厌。這種隔離級(jí)別也支持所謂的不可重復(fù)讀(Nonrepeatable Read)瘟则,因?yàn)橥皇聞?wù)的其他實(shí)例在該實(shí)例處理其間可能會(huì)有新的commit,所以同一select可能返回不同結(jié)果枝秤。
Repeatable Read(可重讀)
這是MySQL的默認(rèn)事務(wù)隔離級(jí)別壹粟,它確保同一事務(wù)的多個(gè)實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí),會(huì)看到同樣的數(shù)據(jù)行宿百。不過(guò)理論上趁仙,這會(huì)導(dǎo)致另一個(gè)棘手的問(wèn)題:幻讀(Phantom Read)。簡(jiǎn)單的說(shuō)垦页,幻讀指當(dāng)用戶讀取某一范圍的數(shù)據(jù)行時(shí)雀费,另一個(gè)事務(wù)又在該范圍內(nèi)插入了新行,當(dāng)用戶再讀取該范圍的數(shù)據(jù)行時(shí)痊焊,會(huì)發(fā)現(xiàn)有新的“幻影” 行盏袄。InnoDB和Falcon存儲(chǔ)引擎通過(guò)多版本并發(fā)控制(MVCC忿峻,Multiversion Concurrency Control 間隙鎖)機(jī)制解決了該問(wèn)題。注:其實(shí)多版本只是解決不可重復(fù)讀問(wèn)題辕羽,而加上間隙鎖(也就是它這里所謂的并發(fā)控制)才解決了幻讀問(wèn)題逛尚。
Serializable(可串行化)
這是最高的隔離級(jí)別,它通過(guò)強(qiáng)制事務(wù)排序刁愿,使之不可能相互沖突绰寞,從而解決幻讀問(wèn)題。簡(jiǎn)言之铣口,它是在每個(gè)讀的數(shù)據(jù)行上加上共享鎖滤钱。在這個(gè)級(jí)別,可能導(dǎo)致大量的超時(shí)現(xiàn)象和鎖競(jìng)爭(zhēng)脑题。
對(duì)于不同的事務(wù)件缸,采用不同的隔離級(jí)別分別有不同的結(jié)果。不同的隔離級(jí)別有不同的現(xiàn)象叔遂。主要有下面
drop,delete與truncate的區(qū)別
drop直接刪掉表 truncate刪除表中數(shù)據(jù)他炊,再插入時(shí)自增長(zhǎng)id又從1開(kāi)始 delete刪除表中數(shù)據(jù),可以加where字句已艰。
(1) DELETE語(yǔ)句執(zhí)行刪除的過(guò)程是每次從表中刪除一行佑稠,并且同時(shí)將該行的刪除操作作為事務(wù)記錄在日志中保存以便進(jìn)行進(jìn)行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的數(shù)據(jù)并不把單獨(dú)的刪除操作記錄記入日志保存旗芬,刪除行是不能恢復(fù)的。并且在刪除的過(guò)程中不會(huì)激活與表有關(guān)的刪除觸發(fā)器捆蜀。執(zhí)行速度快疮丛。
(2) 表和索引所占空間。當(dāng)表被TRUNCATE 后辆它,這個(gè)表和索引所占用的空間會(huì)恢復(fù)到初始大小誊薄,而DELETE操作不會(huì)減少表或索引所占用的空間。drop語(yǔ)句將表所占用的空間全釋放掉锰茉。
(3) 一般而言呢蔫,drop > truncate > delete
(4) 應(yīng)用范圍。TRUNCATE 只能對(duì)TABLE飒筑;DELETE可以是table和view
(5) TRUNCATE 和DELETE只刪除數(shù)據(jù)片吊,而DROP則刪除整個(gè)表(結(jié)構(gòu)和數(shù)據(jù))。
(6) truncate與不帶where的delete :只刪除數(shù)據(jù)协屡,而不刪除表的結(jié)構(gòu)(定義)drop語(yǔ)句將刪除表的結(jié)構(gòu)被依賴的約束(constrain),觸發(fā)器(trigger)索引(index);依賴于該表的存儲(chǔ)過(guò)程/函數(shù)將被保留俏脊,但其狀態(tài)會(huì)變?yōu)椋篿nvalid。
(7) delete語(yǔ)句為DML(data maintain Language),這個(gè)操作會(huì)被放到 rollback segment中,事務(wù)提交后才生效肤晓。如果有相應(yīng)的 tigger,執(zhí)行的時(shí)候?qū)⒈挥|發(fā)爷贫。
(8) truncate认然、drop是DLL(data define language),操作立即生效,原數(shù)據(jù)不放到 rollback segment中漫萄,不能回滾
(9) 在沒(méi)有備份情況下卷员,謹(jǐn)慎使用 drop 與 truncate。要?jiǎng)h除部分?jǐn)?shù)據(jù)行采用delete且注意結(jié)合where來(lái)約束影響范圍腾务”下猓回滾段要足夠大。要?jiǎng)h除表用drop;若想保留表而將表中數(shù)據(jù)刪除窑睁,如果于事務(wù)無(wú)關(guān)挺峡,用truncate即可實(shí)現(xiàn)。如果和事務(wù)有關(guān)担钮,或老師想觸發(fā)trigger,還是用delete橱赠。
(10) Truncate table 表名 速度快,而且效率高,因?yàn)?
truncate table 在功能上與不帶 WHERE 子句的 DELETE 語(yǔ)句相同:二者均刪除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快箫津,且使用的系統(tǒng)和事務(wù)日志資源少狭姨。DELETE 語(yǔ)句每次刪除一行,并在事務(wù)日志中為所刪除的每行記錄一項(xiàng)苏遥。TRUNCATE TABLE 通過(guò)釋放存儲(chǔ)表數(shù)據(jù)所用的數(shù)據(jù)頁(yè)來(lái)刪除數(shù)據(jù)饼拍,并且只在事務(wù)日志中記錄頁(yè)的釋放。
(11) TRUNCATE TABLE 刪除表中的所有行田炭,但表結(jié)構(gòu)及其列师抄、約束、索引等保持不變教硫。新行標(biāo)識(shí)所用的計(jì)數(shù)值重置為該列的種子叨吮。如果想保留標(biāo)識(shí)計(jì)數(shù)值,請(qǐng)改用 DELETE瞬矩。如果要?jiǎng)h除表定義及其數(shù)據(jù)茶鉴,請(qǐng)使用 DROP TABLE 語(yǔ)句。
(12) 對(duì)于由 FOREIGN KEY 約束引用的表景用,不能使用 TRUNCATE TABLE涵叮,而應(yīng)使用不帶 WHERE 子句的 DELETE 語(yǔ)句。由于 TRUNCATE TABLE 不記錄在日志中伞插,所以它不能激活觸發(fā)器割粮。
mysql數(shù)據(jù)庫(kù)引擎MyISAM和InnoDB的區(qū)別
MyISAM | InnoddDB | |
---|---|---|
事務(wù)支持 | 不支持 | 支持 |
鎖的力度 | table | row |
儲(chǔ)存容量 | 沒(méi)有上限 | 64TB |
哈希索引 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |
外鍵 | 不支持 | 支持 |
MySql存儲(chǔ)引擎
MyISAM
- 選擇密集型的表。MyISAM存儲(chǔ)引擎在篩選大量數(shù)據(jù)時(shí)非常迅速媚污,這是它最突出的優(yōu)點(diǎn)穆刻。
- 插入密集型的表。MyISAM的并發(fā)插入特性允許同時(shí)選擇和插入數(shù)據(jù)杠步。例如:MyISAM存儲(chǔ)引擎很適合管理郵件或Web服務(wù)器日志數(shù)據(jù)氢伟。
InnoDB
1.更新密集的表榜轿。InnoDB存儲(chǔ)引擎特別適合處理多重并發(fā)的更新請(qǐng)求。
2.事務(wù)朵锣。InnoDB存儲(chǔ)引擎是支持事務(wù)的標(biāo)準(zhǔn)MySQL存儲(chǔ)引擎谬盐。
3.自動(dòng)災(zāi)難恢復(fù)。與其它存儲(chǔ)引擎不同诚些,InnoDB表能夠自動(dòng)從災(zāi)難中恢復(fù)飞傀。
4.外鍵約束。MySQL支持外鍵的存儲(chǔ)引擎只有InnoDB诬烹。
5.支持自動(dòng)增加列AUTO_INCREMENT屬性砸烦。
一般來(lái)說(shuō),如果需要事務(wù)支持绞吁,并且有較高的并發(fā)讀取頻率幢痘,InnoDB是不錯(cuò)的選擇。
MEMORY
使用MySQL Memory存儲(chǔ)引擎的出發(fā)點(diǎn)是速度家破。為得到最快的響應(yīng)時(shí)間颜说,采用的邏輯存儲(chǔ)介質(zhì)是系統(tǒng)內(nèi)存。雖然在內(nèi)存中存儲(chǔ)表數(shù)據(jù)確實(shí)會(huì)提供很高的性能汰聋,但當(dāng)mysqld守護(hù)進(jìn)程崩潰時(shí)门粪,所有的Memory數(shù)據(jù)都會(huì)丟失。獲得速度的同時(shí)也帶來(lái)了一些缺陷烹困。它要求存儲(chǔ)在Memory數(shù)據(jù)表里的數(shù)據(jù)使用的是長(zhǎng)度不變的格式玄妈,這意味著不能使用BLOB和TEXT這樣的長(zhǎng)度可變的數(shù)據(jù)類型,VARCHAR是一種長(zhǎng)度可變的類型髓梅,但因?yàn)樗贛ySQL內(nèi)部當(dāng)做長(zhǎng)度固定不變的CHAR類型拟蜻,所以可以使用。
一般在以下幾種情況下使用Memory存儲(chǔ)引擎:
1.目標(biāo)數(shù)據(jù)較小女淑,而且被非常頻繁地訪問(wèn)。在內(nèi)存中存放數(shù)據(jù)辜御,所以會(huì)造成內(nèi)存的使用鸭你,可以通過(guò)參數(shù)max_heap_table_size控制Memory表的大小,設(shè)置此參數(shù)擒权,就可以限制Memory表的最大大小袱巨。
2.如果數(shù)據(jù)是臨時(shí)的,而且要求必須立即可用碳抄,那么就可以存放在內(nèi)存表中愉老。
3.存儲(chǔ)在Memory表中的數(shù)據(jù)如果突然丟失,不會(huì)對(duì)應(yīng)用服務(wù)產(chǎn)生實(shí)質(zhì)的負(fù)面影響剖效。
Memory同時(shí)支持散列索引和B樹(shù)索引嫉入。B樹(shù)索引的優(yōu)于散列索引的是焰盗,可以使用部分查詢和通配查詢,也可以使用<咒林、>和>=等操作符方便數(shù)據(jù)挖掘熬拒。散列索引進(jìn)行“相等比較”非常快垫竞,但是對(duì)“范圍比較”的速度就慢多了澎粟,因此散列索引值適合使用在=和<>的操作符中,不適合在<或>操作符中欢瞪,也同樣不適合用在order by子句中活烙。
MERGE
MERGE存儲(chǔ)引擎是一組MyISAM表的組合,這些MyISAM表結(jié)構(gòu)必須完全相同遣鼓,盡管其使用不如其它引擎突出啸盏,但是在某些情況下非常有用。說(shuō)白了譬正,Merge表就是幾個(gè)相同MyISAM表的聚合器宫补;Merge表中并沒(méi)有數(shù)據(jù),對(duì)Merge類型的表可以進(jìn)行查詢曾我、更新粉怕、刪除操作,這些操作實(shí)際上是對(duì)內(nèi)部的MyISAM表進(jìn)行操作抒巢。Merge存儲(chǔ)引擎的使用場(chǎng)景贫贝。
對(duì)于服務(wù)器日志這種信息,一般常用的存儲(chǔ)策略是將數(shù)據(jù)分成很多表蛉谜,每個(gè)名稱與特定的時(shí)間端相關(guān)稚晚。例如:可以用12個(gè)相同的表來(lái)存儲(chǔ)服務(wù)器日志數(shù)據(jù),每個(gè)表用對(duì)應(yīng)各個(gè)月份的名字來(lái)命名型诚。當(dāng)有必要基于所有12個(gè)日志表的數(shù)據(jù)來(lái)生成報(bào)表客燕,這意味著需要編寫(xiě)并更新多表查詢,以反映這些表中的信息狰贯。與其編寫(xiě)這些可能出現(xiàn)錯(cuò)誤的查詢也搓,不如將這些表合并起來(lái)使用一條查詢,之后再刪除Merge表涵紊,而不影響原來(lái)的數(shù)據(jù)傍妒,刪除Merge表只是刪除Merge表的定義,對(duì)內(nèi)部的表沒(méi)有任何影響摸柄。
ARCHIVE
Archive是歸檔的意思颤练,在歸檔之后很多的高級(jí)功能就不再支持了,僅僅支持最基本的插入和查詢兩種功能驱负。在MySQL 5.5版以前嗦玖,Archive是不支持索引患雇,但是在MySQL 5.5以后的版本中就開(kāi)始支持索引了。Archive擁有很好的壓縮機(jī)制踏揣,它使用zlib壓縮庫(kù)庆亡,在記錄被請(qǐng)求時(shí)會(huì)實(shí)時(shí)壓縮,所以它經(jīng)常被用來(lái)當(dāng)做倉(cāng)庫(kù)使用捞稿。
如何選擇合適的存儲(chǔ)引擎又谋?
(1)選擇標(biāo)準(zhǔn)可以分為:
(2)是否需要支持事務(wù);
(3)是否需要使用熱備娱局;
(4)崩潰恢復(fù):能否接受崩潰彰亥;
(5)是否需要外鍵支持;
然后按照標(biāo)準(zhǔn)衰齐,選擇對(duì)應(yīng)的存儲(chǔ)引擎即可任斋。
索引
索引的優(yōu)點(diǎn)
第一,通過(guò)創(chuàng)建唯一性索引耻涛,可以保證數(shù)據(jù)庫(kù)表中每一行數(shù)據(jù)的唯一性废酷。
第二,可以大大加快數(shù)據(jù)的檢索速度抹缕,這也是創(chuàng)建索引的最主要的原因澈蟆。
第三,可以加速表和表之間的連接卓研,特別是在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義趴俘。
第四,在使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時(shí)奏赘,同樣可以顯著減少查詢中分組和排序的時(shí)間寥闪。
第五,通過(guò)使用索引磨淌,可以在查詢的過(guò)程中疲憋,使用優(yōu)化隱藏器,提高系統(tǒng)的性能梁只。
索引的缺點(diǎn)
第一缚柳,創(chuàng)建索引和維護(hù)索引要耗費(fèi)時(shí)間,這種時(shí)間隨著數(shù)據(jù)量的增加而增加敛纲。
第二喂击,索引需要占物理空間剂癌,除了數(shù)據(jù)表占數(shù)據(jù)空間之外淤翔,每一個(gè)索引還要占一定的物理空間,如果要建立聚簇索引佩谷,那么需要的空間就會(huì)更大旁壮。
第三监嗜,當(dāng)對(duì)表中的數(shù)據(jù)進(jìn)行增加、刪除和修改的時(shí)候抡谐,索引也要?jiǎng)討B(tài)的維護(hù)裁奇,這樣就降低了數(shù)據(jù)的維護(hù)速度。
不應(yīng)該創(chuàng)建索引的的這些列具有下列特點(diǎn):
第一麦撵,對(duì)于那些在查詢中很少使用或者參考的列不應(yīng)該創(chuàng)建索引刽肠。這是因?yàn)椋热贿@些列很少使用到免胃,因此有索引或者無(wú)索引音五,并不能提高查詢速度。相反羔沙,由于增加了索引躺涝,反而降低了系統(tǒng)的維護(hù)速度和增大了空間需求。
第二扼雏,對(duì)于那些只有很少數(shù)據(jù)值的列也不應(yīng)該增加索引坚嗜。這是因?yàn)椋捎谶@些列的取值很少诗充,例如人事表的性別列苍蔬,在查詢的結(jié)果中,結(jié)果集的數(shù)據(jù)行占了表中數(shù)據(jù)行的很大比例其障,即需要在表中搜索的數(shù)據(jù)行的比例很大银室。增加索引,并不能明顯加快檢索速度励翼。
第三蜈敢,對(duì)于那些定義為text, image和bit數(shù)據(jù)類型的列不應(yīng)該增加索引。這是因?yàn)槠В@些列的數(shù)據(jù)量要么相當(dāng)大抓狭,要么取值很少。
第四造烁,當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí)否过,不應(yīng)該創(chuàng)建索引。這是因?yàn)椴洋薷男阅芎蜋z索性能是互相矛盾的苗桂。當(dāng)增加索引時(shí),會(huì)提高檢索性能告组,但是會(huì)降低修改性能煤伟。當(dāng)減少索引時(shí),會(huì)提高修改性能,降低檢索性能便锨。因此围辙,當(dāng)修改性能遠(yuǎn)遠(yuǎn)大于檢索性能時(shí),不應(yīng)該創(chuàng)建索引放案。
數(shù)據(jù)庫(kù)范式
第一范式數(shù)據(jù)庫(kù)表中的字段都是單一屬性的姚建,不可再分(就是無(wú)重復(fù)的列)
第二范式就是非主屬性非部分依賴于主關(guān)鍵字(不存在非關(guān)鍵字段 對(duì)任一候選關(guān)鍵字段 的部分 函數(shù)依賴)。
第三范式就是屬性不依賴于其它非主屬性吱殉。
數(shù)據(jù)庫(kù)優(yōu)化的思路
SQL語(yǔ)句優(yōu)化
1)應(yīng)盡量避免在 where 子句中使用!=或<>操作符掸冤,否則將引擎放棄使用索引而進(jìn)行全表掃描。
2)應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷友雳,否則將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描贩虾,如:
select id from t where num is null
可以在num上設(shè)置默認(rèn)值0,確保表中num列沒(méi)有null值沥阱,然后這樣查詢:
select id from t where num=0
3)很多時(shí)候用 exists 代替 in 是一個(gè)好的選擇
4)用Where子句替換HAVING 子句 因?yàn)镠AVING 只會(huì)在檢索出所有記錄之后才對(duì)結(jié)果集進(jìn)行過(guò)濾
索引優(yōu)化
對(duì)頻繁查詢的數(shù)據(jù)字段創(chuàng)建索引
.數(shù)據(jù)庫(kù)結(jié)構(gòu)優(yōu)化
1)范式優(yōu)化: 比如消除冗余(節(jié)省空間缎罢。。)
2)反范式優(yōu)化:比如適當(dāng)加冗余等(減少join)
3)拆分表: 分區(qū)將數(shù)據(jù)在物理上分隔開(kāi)考杉,不同分區(qū)的數(shù)據(jù)可以制定保存在處于不同磁盤(pán)上的數(shù)據(jù)文件里策精。這樣,當(dāng)對(duì)這個(gè)表進(jìn)行查詢時(shí)崇棠,只需要在表分區(qū)中進(jìn)行掃描咽袜,而不必進(jìn)行全表掃描,明顯縮短了查詢時(shí)間枕稀,另外處于不同磁盤(pán)的分區(qū)也將對(duì)這個(gè)表的數(shù)據(jù)傳輸分散在不同的磁盤(pán)I/O询刹,一個(gè)精心設(shè)置的分區(qū)可以將數(shù)據(jù)傳輸對(duì)磁盤(pán)I/O競(jìng)爭(zhēng)均勻地分散開(kāi)。對(duì)數(shù)據(jù)量大的時(shí)時(shí)表可采取此方法萎坷“剂可按月自動(dòng)建表分區(qū)。
4)拆分其實(shí)又分垂直拆分和水平拆分: 案例: 簡(jiǎn)單購(gòu)物系統(tǒng)暫設(shè)涉及如下表: 1.產(chǎn)品表(數(shù)據(jù)量10w哆档,穩(wěn)定) 2.訂單表(數(shù)據(jù)量200w蔽挠,且有增長(zhǎng)趨勢(shì)) 3.用戶表 (數(shù)據(jù)量100w,且有增長(zhǎng)趨勢(shì)) 以mysql為例講述下水平拆分和垂直拆分瓜浸,mysql能容忍的數(shù)量級(jí)在百萬(wàn)靜態(tài)數(shù)據(jù)可以到千萬(wàn) 垂直拆分:解決問(wèn)題:表與表之間的io競(jìng)爭(zhēng) 不解決問(wèn)題:?jiǎn)伪碇袛?shù)據(jù)量增長(zhǎng)出現(xiàn)的壓力 方案: 把產(chǎn)品表和用戶表放到一個(gè)server上 訂單表單獨(dú)放到一個(gè)server上 水平拆分: 解決問(wèn)題:?jiǎn)伪碇袛?shù)據(jù)量增長(zhǎng)出現(xiàn)的壓力 不解決問(wèn)題:表與表之間的io爭(zhēng)奪
方案: 用戶表通過(guò)性別拆分為男用戶表和女用戶表 訂單表通過(guò)已完成和完成中拆分為已完成訂單和未完成訂單 產(chǎn)品表 未完成訂單放一個(gè)server上 已完成訂單表盒男用戶表放一個(gè)server上 女用戶表放一個(gè)server上(女的愛(ài)購(gòu)物 哈哈)
sql語(yǔ)句安全性
(1)防止sql注入澳淑,對(duì)特殊字符進(jìn)行轉(zhuǎn)義,過(guò)濾或者使用預(yù)編譯的sql語(yǔ)句綁定變量插佛。
(2)最小權(quán)限原則杠巡,特別是不要用root賬戶,為不同的類型的動(dòng)作或者組建使用不同的賬戶雇寇。
(3)當(dāng)sql運(yùn)行出錯(cuò)時(shí)氢拥,不要把數(shù)據(jù)庫(kù)返回的錯(cuò)誤信息全部顯示給用戶绑改,以防止泄漏服務(wù)器和數(shù)據(jù)庫(kù)相關(guān)信息。
面試問(wèn)題
一張表,里面有ID自增主鍵,當(dāng)insert了17條記錄之后,刪除了第15,16,17條記錄,再把mysql重啟,再insert一條記錄,這條記錄的ID是18還是15 兄一?
(1)如果表的類型是MyISAM,那么是18识腿。
因?yàn)镸yISAM表會(huì)把自增主鍵的最大ID記錄到數(shù)據(jù)文件里出革,重啟MySQL自增主鍵的最大ID也不會(huì)丟失。
(2)如果表的類型是InnoDB渡讼,那么是15骂束。
InnoDB表只是把自增主鍵的最大ID記錄到內(nèi)存中,所以重啟數(shù)據(jù)庫(kù)或者是對(duì)表進(jìn)行OPTIMIZE操作成箫,都會(huì)導(dǎo)致最大ID丟失展箱。