數據庫知識整理筆記

事務的主要特性:原子性、一致性、獨立性和持久性(ACID)前端

數據庫應用優化mysql

一、基本語句優化10個原則sql

1)儘可能避免在列上進行運算,這樣會致使索引失效數據庫

2)使用join時,應該用小結果集驅動大結果集。同時把複雜的join查詢拆分紅多個query後端

3)注意like模糊查詢的使用,避免%%安全

4)僅列出須要查詢的字段,這對速度不會有明顯的影響,主要考慮節省內存服務器

5)使用批量插入語句節省交互數據結構

6)limit的基數比較大時使用between併發

7)不要使用rand函數獲取多條隨機記錄異步

8)避免使用NULL

9)不要使用count(id),應該使用count(*)

10)不要作無謂的排序,應儘量在索引中完成排序

二、mysql索引創建和使用基本原則

1)合理設計和使用索引

2)在關鍵字的索引上,建與不建索引,查詢速度相差近100倍

3)差的索引和沒有索引效果同樣

4)索引並不是越多越好,由於維護索引須要成本

5)每一個表的索引應在5個如下,應合理利用部分索引和聯合索引

6)不在結果集中的結果單一的列上建索引

7)建索引的字段結果集最好分佈均勻,或者符合正態分佈

三、服務器和配置優化

選擇存儲引擎的基本原則:

1)採用MyISAM引擎:讀/寫>100:1且update相對較少;併發不高,不須要事務;表數據量小;硬件資源有限

2)採用InnoDB引擎:R/W比較小,頻繁更新大字段;表數據量超過1000萬,併發高;安全性和可用性要求高

3)採用Memory引擎:有足夠的內存;對數據一致性要求不高;須要按期歸檔的數據

mysql服務器調整優化:

1)關閉沒必要要的二進制日誌和慢查詢日誌,僅在內存足夠或開發調試時打開他們

2)適度使用query cache

3)增長mysql容許的最大鏈接數(show variables like 'max_connections')

4)對myisam表適當增長key_buffer_size

mysq瓶頸及應對措施:

1)增長mysql配置中的buffer和cache的數值,增長服務器cpu數量和內存的大小

2)使用第三方引擎或衍生版本

3)遷移其餘數據庫

數據庫分區

概念:所謂分區就是把一個數據表的文件和索引分散存儲在不一樣的物理文件中。mysql支持的分區類型包括:range(經常使用)、list、hash、key

分區的注意事項

1)主鍵或者惟一索引必須包含分區字段

2)不少時候,使用分區就不要再使用主鍵,可能影響性能

3)只能經過int類型的字段或者返回int類型的表達式來分區,一般用year或to_days等函數

4)每一個表最多1024個分區,不可能無限制擴展分區,並且過分使用分區每每會消耗大量系統內存

5)採用分區的表不支持外建

6)分區後,可能形成索引失效,須要驗證分區可行性

數據庫分表

概念:分表思想和分區相似,區別是:分區是把一個邏輯文件分紅幾個物理文件後進行存儲,而分表則是把原先宇哥表拆分紅幾個表。進行分表查詢時,能夠union或者作一個視圖。分表又分爲垂直切分和水平切分,其中水平切分最經常使用

mysql高級應用

一、mysql自增加序列(auto_increment)

可能須要使用序列的狀況:

1)業務複雜,須要定製和控制主鍵時

2)但願手工維護自增加,方便數據遷移

3)須要業務上一個有意義的主鍵時,好比單據號

4)當事務跨多表,指望事務可靠性

5)主鍵很明確的須要和其餘表關聯時

6)指望主鍵是惟一的,不須要重複利用時

二、msql視圖

概念:視圖是一個虛擬表,其內容由查詢定義。對其中所引用的基礎表來講,視圖的做用相似於篩選,篩選

當前或者其餘數據庫的一個或多個表

建立視圖的注意事項:

1)select語句不能包含from子句中的子查詢

2)select語句不能引用系統或用戶變量

3)select語句不能引用預處理語句

4)在存儲子程序內,定義不能引用子程序的參數或局部變量

5)在定義中引用的表或視圖必須存在

6)在定義中不能引用temporary表,不能建立temporary

7)在視圖定義中命名的表必須已存在

8)不能將觸發程序與視圖關聯在一塊兒

9)在試圖定義中容許使用order by,可是,若是從特定視圖進行了選擇,而視圖又使用了具備本身的order by的語句,他將被忽略

10)不能給視圖添加索引

11)視圖一般不容許更新

三、mysql存儲過程和事件調度

概念:利用sql語言完成複雜的數據庫層業務操做,經過編寫存儲過程來實現

建立存儲過程步驟:

1)肯定輸入/輸出參數和類型(IN表示輸入參數,$tname是參數名,varchar(20)是參數類型)

2)定義變量和賦值(使用declare關鍵字定義變量,set關鍵字用來賦值)

3)過程的主體部分,能夠是各類運算,也能夠是數據庫操做

4)程序的返回值。能夠有返回值,也能夠無返回值

優缺點:存儲過程能提高效率,還具備模塊化、易於複用、能夠移植等特色,但mysql存儲過程沒有強大的調試工具,不易維護。

四、mysql模擬消息隊列:

隊列概念:隊列和棧同樣,是一種線性表結構,不過隊列是一種先進先出的數據結構。隊列只容許在後端進行插入操做,在前端進行刪除操做。

消息隊列:在消息的傳輸過程當中保存消息的容器

消息隊列管理器:將消息從它的源中繼到它的目標時充當中間人的角色

隊列做用:主要提供路由並保證筱梓的傳遞,若是發送消息時接收者不可用,消息隊列會保留消息,直到成功的傳遞。

消息隊列做用:能夠很好的異步處理數據傳送和存儲,當頻繁地向數據庫中插入數據時,就可採起消息隊列異步插入。另外,可將較慢的處理邏輯、有併發數量限制的處理邏輯,經過消息隊列放在後臺處理。如:視頻轉換、發送手機短信

五、sql注入漏洞與防範:

1)若是是整型變量或字段,使用intval()函數把全部傳入參數轉化爲一個數值

2)對於字符型變量,用addslashes()會把全部的單引號、雙引號、反斜線和空字符轉換爲含有反斜線的溢出字符

3)轉義或過濾一些特殊字符

4)保護表結構等關鍵信息

5)任何狀況下作好安全備份

相關文章
相關標籤/搜索