数据库知识整理笔记
為什么80%的碼農都做不了架構師?>>> ??
事務的主要特性:原子性、一致性、獨立性和持久性(ACID)
數據庫應用優化
1、基本語句優化10個原則
1)盡量避免在列上進行運算,這樣會導致索引失效
2)使用join時,應該用小結果集驅動大結果集。同時把復雜的join查詢拆分成多個query
3)注意like模糊查詢的使用,避免%%
4)僅列出需要查詢的字段,這對速度不會有明顯的影響,主要考慮節省內存
5)使用批量插入語句節省交互
6)limit的基數比較大時使用between
7)不要使用rand函數獲取多條隨機記錄
8)避免使用NULL
9)不要使用count(id),應該使用count(*)
10)不要做無謂的排序,應盡可能在索引中完成排序
2、mysql索引建立和使用基本原則
1)合理設計和使用索引
2)在關鍵字的索引上,建與不建索引,查詢速度相差近100倍
3)差的索引和沒有索引效果一樣
4)索引并非越多越好,因為維護索引需要成本
5)每個表的索引應在5個以下,應合理利用部分索引和聯合索引
6)不在結果集中的結果單一的列上建索引
7)建索引的字段結果集最好分布均勻,或者符合正態分布
3、服務器和配置優化
選擇存儲引擎的基本原則:
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高級應用
1、mysql自增長序列(auto_increment)
可能需要使用序列的情況:
1)業務復雜,需要定制和控制主鍵時
2)希望手工維護自增長,方便數據遷移
3)需要業務上一個有意義的主鍵時,比如單據號
4)當事務跨多表,期望事務可靠性
5)主鍵很明確的需要和其他表關聯時
6)期望主鍵是唯一的,不需要重復利用時
2、msql視圖
概念:視圖是一個虛擬表,其內容由查詢定義。對其中所引用的基礎表來說,視圖的作用類似于篩選,篩選
當前或者其他數據庫的一個或多個表
創建視圖的注意事項:
1)select語句不能包含from子句中的子查詢
2)select語句不能引用系統或用戶變量
3)select語句不能引用預處理語句
4)在存儲子程序內,定義不能引用子程序的參數或局部變量
5)在定義中引用的表或視圖必須存在
6)在定義中不能引用temporary表,不能創建temporary
7)在視圖定義中命名的表必須已存在
8)不能將觸發程序與視圖關聯在一起
9)在試圖定義中允許使用order by,但是,如果從特定視圖進行了選擇,而視圖又使用了具有自己的order by的語句,他將被忽略
10)不能給視圖添加索引
11)視圖通常不允許更新
3、mysql存儲過程和事件調度
概念:利用sql語言完成復雜的數據庫層業務操作,通過編寫存儲過程來實現
創建存儲過程步驟:
1)確定輸入/輸出參數和類型(IN表示輸入參數,$tname是參數名,varchar(20)是參數類型)
2)定義變量和賦值(使用declare關鍵字定義變量,set關鍵字用來賦值)
3)過程的主體部分,可以是各種運算,也可以是數據庫操作
4)程序的返回值。可以有返回值,也可以無返回值
優缺點:存儲過程能提升效率,還具有模塊化、易于復用、可以移植等特點,但mysql存儲過程沒有強大的調試工具,不易維護。
4、mysql模擬消息隊列:
隊列概念:隊列和棧一樣,是一種線性表結構,不過隊列是一種先進先出的數據結構。隊列只允許在后端進行插入操作,在前端進行刪除操作。
消息隊列:在消息的傳輸過程中保存消息的容器
消息隊列管理器:將消息從它的源中繼到它的目標時充當中間人的角色
隊列作用:主要提供路由并保證筱梓的傳遞,如果發送消息時接收者不可用,消息隊列會保留消息,直到成功的傳遞。
消息隊列作用:可以很好的異步處理數據傳送和存儲,當頻繁地向數據庫中插入數據時,就可采取消息隊列異步插入。另外,可將較慢的處理邏輯、有并發數量限制的處理邏輯,通過消息隊列放在后臺處理。如:視頻轉換、發送手機短信
5、sql注入漏洞與防范:
1)如果是整型變量或字段,使用intval()函數把所有傳入參數轉化為一個數值
2)對于字符型變量,用addslashes()會把所有的單引號、雙引號、反斜線和空字符轉換為含有反斜線的溢出字符
3)轉義或過濾一些特殊字符
4)保護表結構等關鍵信息
5)任何情況下做好安全備份
轉載于:https://my.oschina.net/u/863367/blog/862521
總結
- 上一篇: docker supervisor进程管
- 下一篇: linux cmake编译源码,linu