MyISAM和InnoDB的區(qū)別
MyISAM不支持事務(wù),而InnoDB支持事務(wù)的。
MyISAM鎖的粒度是表級,而InnoDB支持行級鎖定。
MyISAM支持全文索引,而Innodb不支持全文索引
MyISAM表是保存成文件形式的,在跨平臺的數(shù)據(jù)轉(zhuǎn)移中使用MyISAM存儲會省去不少的麻煩。
InnoDB表比MyISAM表更安全,可以保證數(shù)據(jù)不丟失的情況下,切換非事務(wù)表到事務(wù)表
應(yīng)用場景
MyISAM 管理非事務(wù)表,它提供高速存儲和檢索,以及全文搜索能力。如果應(yīng)用中需要執(zhí)行大量的SELECT查詢,那么MyISAM是更好的選擇。
InnoDB用于事務(wù)處理應(yīng)用程序,具有眾多特性,包括ACID事務(wù)支持。如果應(yīng)用中需要執(zhí)行大量的INSERT或UPDATE操作,則應(yīng)該使用InnoDB,這樣可以提高多用戶并發(fā)操作的性能。
sql注入原理
就是通過把SQL命令插入到Web 表單 提交或輸入域名或頁面請求的查詢字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令?
1.猜表名,列名等?
2.后臺身份驗(yàn)證繞過漏洞 驗(yàn)證繞過漏洞就是'or'='or'后臺繞過漏洞,利用的就是AND和OR的運(yùn)算規(guī)則,從而造成后臺腳本邏輯性錯誤.
防范:?
1.永遠(yuǎn)不要信任用戶的輸入,要對用戶的輸入進(jìn)行校驗(yàn),可以通過正則表達(dá)式,或限制長度,對單引號和雙"-"進(jìn)行轉(zhuǎn)換等。?
2.永遠(yuǎn)不要使用動態(tài)拼裝SQL,可以使用參數(shù)化的SQL或者直接使用存儲過程進(jìn)行數(shù)據(jù)查詢存取。?
3.永遠(yuǎn)不要使用管理員權(quán)限的數(shù)據(jù)庫連接,為每個應(yīng)用使用單獨(dú)的權(quán)限有限的數(shù)據(jù)庫連接。?
4.不要把機(jī)密信息明文存放,請加密或者h(yuǎn)ash掉密碼和敏感的信息。
?5.應(yīng)用的異常信息應(yīng)該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進(jìn)行包裝,把異常信息存放在獨(dú)立的表中。
數(shù)據(jù)庫范式
第一范式(1NF):屬性不可分。比如某些數(shù)據(jù)庫系統(tǒng)中需要用到“地址”這個屬性,本來直接將“地址”屬性設(shè)計(jì)成一個數(shù)據(jù)庫表的字段就行。但是如果系統(tǒng)經(jīng)常會訪問“地址”屬性中的“城市”部分,那么就非要將“地址”這個屬性重新拆分為省份、城市、詳細(xì)地址等多個部分進(jìn)行存儲,這樣在對地址中某一部分操作的時候?qū)⒎浅7奖恪?/p>
第二范式(2NF):符合1NF,并且,非主屬性完全依賴于碼(也就是說在一個數(shù)據(jù)庫表中,一個表中只能保存一種數(shù)據(jù),不可以把多種數(shù)據(jù)保存在同一張數(shù)據(jù)庫表中)。
第三范式(3NF):符合2NF,并且,消除傳遞依賴(每一列數(shù)據(jù)都和主鍵直接相關(guān),而不能間接相關(guān))。 BCNF:符合3NF,并且,沒有任何屬性完全函數(shù)依賴于非碼的任何一組屬性. 找個例子說.
參考:http://www.itdecent.cn/p/7b207d857f04
數(shù)據(jù)庫索引
索引是一個單獨(dú)存儲在磁盤上的數(shù)據(jù)庫結(jié)構(gòu),它們包含著對數(shù)據(jù)表里所有記錄的引用指針,使用索引可以提高數(shù)據(jù)庫特定數(shù)據(jù)的查詢速度.索引時在存儲引擎中實(shí)現(xiàn)的,因此每種存儲引擎的索引不一定完全相同,并且每種存儲引擎也不一定支持所有索引類型.
索引的存儲類型有兩種:BTREE和HASH,具體和表的存儲引擎有關(guān).MyISAM和InnoDB存儲引擎只支持BTREE;MEMORY/HEAD存儲索引可以支持HASH和BTREE索引.
索引的優(yōu)點(diǎn):
1.通過創(chuàng)建唯一索引,可以保證數(shù)據(jù)庫表中每行數(shù)據(jù)的唯一性.
2.可以加快數(shù)據(jù)的查詢速度.
3.在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面,可以加速表和表之間的連接.
4.再使用分組和排序子句進(jìn)行數(shù)據(jù)檢索時,同樣可以顯著減少查詢中分組和排序的時間
5.通過使用索引,可以在查詢中使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
索引的缺點(diǎn):
1.創(chuàng)建索引和維護(hù)索引要耗費(fèi)時間,并且隨著數(shù)據(jù)量的增加耗費(fèi)時間也增加.
2.索引需要占空間內(nèi)存.
3.在對表中數(shù)據(jù)進(jìn)行增加,刪除和修改的時候,索引也需要動態(tài)維護(hù),這樣降低了數(shù)據(jù)維護(hù)速度.
索引分類
1.普通索引和唯一索引
2.直接創(chuàng)建索引和間接創(chuàng)建索引
3.普通索引和唯一性索引
4.單個索引和覆蓋索引
5.聚簇索引和非聚簇索引
參考鏈接:http://www.itdecent.cn/p/15d6e39013d6、
索引失效??
1.WHERE字句的查詢條件里有不等于號(WHERE column!=...),MYSQL將無法使用索引
2.如果WHERE字句的查詢條件里使用了函數(shù)(如:WHERE DAY(column)=...),MYSQL將無法使用索引
3.在JOIN操作中(需要從多個數(shù)據(jù)表提取數(shù)據(jù)時),MYSQL只有在主鍵和外鍵的數(shù)據(jù)類型相同時才能使用索引,否則即使建立了索引也不會使用。
4.如果WHERE子句的查詢條件里使用了比較操作符LIKE和REGEXP,MYSQL只有在搜索模板的第一個字符不是通配符的情況下才能使用索引。比如說,如果查詢條件是LIKE 'abc%',MYSQL將使用索引;如果條件是LIKE '%abc',MYSQL將不使用索引。
5.在ORDER BY操作中,MYSQL只有在排序條件不是一個查詢條件表達(dá)式的情況下才使用索引。盡管如此,在涉及多個數(shù)據(jù)表的查詢里,即使有索引可用,那些索引在加快ORDER BY操作方面也沒什么作用。
6.如果某個數(shù)據(jù)列里包含著許多重復(fù)的值,就算為它建立了索引也不會有很好的效果。比如說,如果某個數(shù)據(jù)列里包含了凈是些諸如“0/1”或“Y/N”等值,就沒有必要為它創(chuàng)建一個索引。
7.如果條件中有or(并且其中有or的條件是不帶索引的),即使其中有條件帶索引也不會使用(這也是為什么盡量少用or的原因)。注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引。
8.如果列類型是字符串,那一定要在條件中將數(shù)據(jù)使用引號引用起來,否則不使用索引。
9.如果mysql估計(jì)使用全表掃描要比使用索引快,則不使用索引。
http://www.cnblogs.com/hongfei/archive/2012/10/20/2732589.htmlhttp://my.oschina.net/hebad/blog/370815
數(shù)據(jù)庫鎖機(jī)制
數(shù)據(jù)庫鎖定機(jī)制簡單來說就是數(shù)據(jù)庫為了保證數(shù)據(jù)的一致性而使各種共享資源在被并發(fā)訪問,訪問變得有序所設(shè)計(jì)的一種規(guī)則。MySQL各存儲引擎使用了三種類型(級別)的鎖定機(jī)制:行級鎖定,頁級鎖定和表級鎖定。
1.表級鎖定(table-level):表級別的鎖定是MySQL各存儲引擎中最大顆粒度的鎖定機(jī)制。該鎖定機(jī)制最大的特點(diǎn)是實(shí)現(xiàn)邏輯非常簡單,帶來的系統(tǒng)負(fù)面影響最小。所以獲取鎖和釋放鎖的速度很快。由于表級鎖一次會將整個表鎖定,所以可以很好的避免困擾我們的死鎖問題。當(dāng)然,鎖定顆粒度大所帶來最大的負(fù)面影響就是出現(xiàn)鎖定資源爭用的概率也會最高,致使并大度大打折扣。表級鎖分為讀鎖和寫鎖。
2.頁級鎖定(page-level):頁級鎖定的特點(diǎn)是鎖定顆粒度介于行級鎖定與表級鎖之間,所以獲取鎖定所需要的資源開銷,以及所能提供的并發(fā)處理能力也同樣是介于上面二者之間。另外,頁級鎖定和行級鎖定一樣,會發(fā)生死鎖。
3.行級鎖定(row-level):行級鎖定最大的特點(diǎn)就是鎖定對象的顆粒度很小,也是目前各大數(shù)據(jù)庫管理軟件所實(shí)現(xiàn)的鎖定顆粒度最小的。由于鎖定顆粒度很小,所以發(fā)生鎖定資源爭用的概率也最小,能夠給予應(yīng)用程序盡可能大的并發(fā)處理能力而提高一些需要高并發(fā)應(yīng)用系統(tǒng)的整體性能。雖然能夠在并發(fā)處理能力上面有較大的優(yōu)勢,但是行級鎖定也因此帶來了不少弊端。由于鎖定資源的顆粒度很小,所以每次獲取鎖和釋放鎖需要做的事情也更多,帶來的消耗自然也就更大了。此外,行級鎖定也最容易發(fā)生死鎖。InnoDB的行級鎖同樣分為兩種,共享鎖和排他鎖,同樣InnoDB也引入了意向鎖(表級鎖)的概念,所以也就有了意向共享鎖和意向排他鎖,所以InnoDB實(shí)際上有四種鎖,即共享鎖(S)、排他鎖(X)、意向共享鎖(IS)、意向排他鎖(IX); 在MySQL數(shù)據(jù)庫中,使用表級鎖定的主要是MyISAM,Memory,CSV等一些非事務(wù)性存儲引擎,而使用行級鎖定的主要是Innodb存儲引擎和NDBCluster存儲引擎,頁級鎖定主要是BerkeleyDB存儲引擎的鎖定方式。
而意向鎖的作用就是當(dāng)一個事務(wù)在需要獲取資源鎖定的時候,如果遇到自己需要的資源已經(jīng)被排他鎖占用的時候,該事務(wù)可以需要鎖定行的表上面添加一個合適的意向鎖。如果自己需要一個共享鎖,那么就在表上面添加一個意向共享鎖。而如果自己需要的是某行(或者某些行)上面添加一個排他鎖的話,則先在表上面添加一個意向排他鎖。意向共享鎖可以同時并存多個,但是意向排他鎖同時只能有一個存在。
| | 共享鎖(S)| 排他鎖(X)| 意向共享鎖(IS)| 意向排他鎖(IX)| 共享鎖(S) | 兼容 | 沖突 | 兼容 |沖突 排他鎖(X) | 沖突 | 沖突 | 沖突 |沖突 意向共享鎖(IS) | 兼容 | 沖突 | 兼容 |兼容 意向排他鎖(IX) | 沖突 | 沖突 | 兼容 |兼容
參考地址:http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html
MyISAM 表鎖優(yōu)化建議:?
1、縮短鎖定時間?
2、分離能并行的操作?
3、合理利用讀寫優(yōu)先級
樂觀鎖,悲觀鎖
1. 悲觀鎖:它指的是對數(shù)據(jù)被外界(包括本系統(tǒng)當(dāng)前的其他事務(wù),以及來自外部系統(tǒng)的事務(wù)處理)修改持保守態(tài)度,因此,在整個數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài)。悲觀鎖的實(shí)現(xiàn),往往依靠數(shù)據(jù)庫提供的鎖機(jī)制。悲觀的缺陷是不論是頁鎖還是行鎖,加鎖的時間可能會很長,這樣可能會長時間的限制其他用戶的訪問,也就是說悲觀鎖的并發(fā)訪問性不好。
2. 樂觀鎖( Optimistic Locking ) :相對悲觀鎖而言,樂觀鎖假設(shè)認(rèn)為數(shù)據(jù)一般情況下不會造成沖突,所以在數(shù)據(jù)進(jìn)行提交更新的時候,才會正式對數(shù)據(jù)的沖突與否進(jìn)行檢測,如果發(fā)現(xiàn)沖突了,則則拒絕更新并返回用戶錯誤的信息,讓用戶決定如何去做。樂觀鎖由程序?qū)崿F(xiàn),不會存在死鎖問題。它適用的場景也相對樂觀。但樂觀鎖不能解決臟讀的問題
悲觀鎖:假定會發(fā)生并發(fā)沖突,屏蔽一切可能違反數(shù)據(jù)完整性的操作。[1] 樂觀鎖:假設(shè)不會發(fā)生并發(fā)沖突,只在提交操作時檢查是否違反數(shù)據(jù)完整性。[1] 樂觀鎖不能解決臟讀的問題。
事務(wù)隔離機(jī)制
事務(wù)隔離級別:
未提交讀(READ UNCOMMITTED):事務(wù)中的修改,即使未提交,對其他事務(wù)也都是可見的。事務(wù)可以讀取未提交的數(shù)據(jù),這也稱為臟讀。
提交讀(READ COMMITTED):一個事物從開始到提交之前,所做的任何修改對其他事物都是不可見的,這個級別有時候叫做不可重復(fù)讀。這個級別上兩次執(zhí)行同樣的查詢會得到不一樣的結(jié)果。
可重復(fù)讀(REPEATABLE READ):解決了臟讀問題,該級別保證了在同一個事務(wù)中多次讀同樣記錄的結(jié)果是一致的,理論上無法解決幻讀問題。幻讀就是當(dāng)某個事務(wù)在讀取某個范圍內(nèi)的記錄時,另外一個事務(wù)又在該范圍內(nèi)插入新的記錄,當(dāng)之前的事物再次讀取該范圍的記錄時會產(chǎn)生幻行。
可串行化(SERIZLIZABLE):它通過強(qiáng)制事務(wù)串行執(zhí)行,避免了前面說的幻讀的問題。
臟讀 不可重復(fù)讀 幻讀可能性 加鎖讀 未提交讀 YES YES YES NO 提交讀 NO YES YES NO 可重復(fù)讀 NO NO YES NO 可串行化 NO NO NO YES
臟讀、不可重復(fù)讀和幻讀
臟讀: 事務(wù)T1更新了一行記錄內(nèi)容,但并沒有提交修改。事務(wù)T2讀取更新后的行,然后T1執(zhí)行回滾操作。讀取了剛才所做的修改?,F(xiàn)在T2讀取的行就無效了。(一個事務(wù)讀取了另一個事務(wù)未提交的數(shù)據(jù))
不可重復(fù)讀:事務(wù)T1讀取了一行記錄,緊接著T2修改了T1剛才讀取的那一行記錄,然后T1又再次讀取這行記錄,發(fā)現(xiàn)與剛才讀取的結(jié)果不同。
幻讀:事務(wù)T1讀取一個結(jié)果集,然后T2事務(wù)在T1結(jié)果集范圍內(nèi)插入一行記錄。然后T1再次對表進(jìn)行檢索,發(fā)現(xiàn)多了T2插入的數(shù)據(jù)。
數(shù)據(jù)庫事務(wù)屬性
事務(wù)是由一組SQL語句組成的邏輯處理單元,事務(wù)具有以下4個屬性,通常簡稱為事務(wù)的ACID屬性。 原子性(Atomicity):事務(wù)是一個原子操作單元,其對數(shù)據(jù)的修改,要么全都執(zhí)行,要么全都不執(zhí)行。 一致性(Consistent):在事務(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樹索引或雙向鏈表)也都必須是正確的。 隔離性(Isolation):數(shù)據(jù)庫系統(tǒng)提供一定的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的“獨(dú)立”環(huán)境執(zhí)行。這意味著事務(wù)處理過程中的中間狀態(tài)對外部是不可見的,反之亦然。 持久性(Durable):事務(wù)完成之后,它對于數(shù)據(jù)的修改是永久性的,即使出現(xiàn)系統(tǒng)故障也能夠保持。
數(shù)據(jù)庫連接池原理
背景
傳統(tǒng)的數(shù)據(jù)庫連接方式是,用戶每次請求都要向數(shù)據(jù)庫獲取連接,而數(shù)據(jù)庫連接的創(chuàng)建和關(guān)閉需要一定的開銷。頻繁的建立、關(guān)閉數(shù)據(jù)庫,會極大的降低系統(tǒng)的性能,增大系統(tǒng)的開銷,甚至成為系統(tǒng)的瓶頸。另外使用這種傳統(tǒng)的模式,還必須管理數(shù)據(jù)庫的每一個連接,以確保他們能正確關(guān)閉,如果出現(xiàn)程序異常而導(dǎo)致某些連接未能關(guān)閉。同時無節(jié)制的創(chuàng)建連接極易導(dǎo)致數(shù)據(jù)庫服務(wù)器內(nèi)存溢出。
原理
數(shù)據(jù)庫連接池的基本思想就是為數(shù)據(jù)庫連接建立一個“緩沖池”。預(yù)先在緩沖池中放入一定數(shù)量的連接,當(dāng)需要建立數(shù)據(jù)庫連接時,只需從“緩沖池”中取出一個,使用完畢之后再放回去。以及一套連接使用、分配、管理策略,使得該連接池中的連接可以得到高效、安全的復(fù)用,避免了數(shù)據(jù)庫連接頻繁建立、關(guān)閉的開銷。我們可以通過設(shè)定連接池最大連接數(shù)來防止系統(tǒng)無盡的與數(shù)據(jù)庫連接。