mysql+redis+memcached
數據庫
數據庫設計
a. 單表
b. FK(單表;一張表存儲時,若是有重複出現的字段爲了防止硬盤的浪費,因此作一個FK;去掉FK變成單表(這樣子訪問速度快了))
c. M2M(多對多關係)
究竟是什麼關係?
單選的下拉框/radio FK;多選下拉框/checkbox M2M
舉個小例子:html
問題:員工信息表員工當前薪資;保留員工的全部的調薪記錄。
思路一:兩張表
員工表:
id name salary
調薪:
id price time 員工ID
思路二:三張表
員工表:
id name salary
調薪:
id price time
員工調薪表:
id uid sid
基本SQL
分組(group by)
select depart_id,count(1),max(salary),min(age),sum(age) from user group by depart_id select depart_id,count(1),max(salary),min(age),sum(age) from user group by depart_id having count(1)>5
注意事項:前端
經過聚合條件group by而後進行篩選的用having不能用where
連表
inner join / left join / right join
inner join是保留兩個共有的,若是一個沒有就不保留。
left join 是以左表爲主表,若是右表沒數據,則爲null
right join 是以右表爲主表,若是左表沒數據,則爲null
舉個小例子:mysql
數據: 部門表: id title 1 銷售 2 運營 3 IT 用戶表: id name 部門id 1 x1 1 2 x2 1 3 x3 1 4 x4 1 5 x5 1
請問查到多少條數據? select * from userinfo left join depart on userinfo.did = depart.id 5 select * from depart left join userinfo on userinfo.did = depart.id 7 select * from userinfo inner join depart on userinfo.did = depart.id 5 select * from depart inner join userinfo on userinfo.did = depart.id 5
MySQL數據庫引擎以及區別?
a. 常見innodb、mysiam b. 區別: - innodb: - 支持事務(特性:原子性、一致性、隔離性、持久性) 事務就是(要完成都完成,要不完成就回滾) - 表鎖 - 行鎖 - mysiam - 不支持事務 - 表鎖 - 全文索引 - 速度快
補充: 原生SQL begin; select * from xxx for update; update ... commit; django: with trancation.automic: User.objects.filter().select_for_update()
應用場景:商品數據計數。
索引
做用: - 加速查找 - 約束 種類: - 索引:隨便寫 - 惟一索引:容許Null + 不重複 - 主鍵索引:不容許Null + 不重複 - 聯合索引:多列組成一個索引 - 聯合惟一索引:多列組成一個索引 + 惟一 例如: name email pwd 命中索引遵循最左前綴的原則: name、name email、name pwd、name email pw
補充: - 覆蓋索引,當查找數據時候在索引表中就能夠獲取數據,無需去數據表中查找。 select name from user where name='xxx' - 索引合併, 使用多個單列索引進行查找。 select * from user where name='xx' email='xx' 爲何索引快? 由於在索引結構中講述按照B+來進行存放的數據。
優化數據庫方案
a. 索引。 b. 固定長度的字段寫在前面。 id name age < id age name c. 對於固定選擇的內容:性別,能夠將其對應關係保存在內存中。 d. 分表 - 垂直分分,將數據分割到N張表。 - 水平分分,將列分到到N種表。 e. 分庫 f. 讀寫分離(主從複製) 主:讀寫 從:讀 在django中的應用: models.Users.objects.filter(id=2).using('default') models.Users.objects.filter(id=2).using('db1') g. limit select * from tb where name='alex' limit 1; h. 緩存 將經常使用數據讀取到redis中(緩存),讀取速度快。
char和varchar的區別。
char是定長,不變的。
varchar是變長,可變的。
視圖、觸發器、存儲過程、函數
視圖:視圖是虛擬表或邏輯表,它被定義爲具備鏈接的SQL SELECT查詢語句。由於數據庫視圖與數據庫表相似,它由行和列組成,所以能夠根據數據庫表查詢數據。其內容由查詢定義。
可是,視圖並不在數據庫中以存儲的數據值集形式存在,行和列數據來自由定義視圖的查詢所引用的表,而且在引用視圖時動態生成。簡單的來講視圖是由其定義結果組成的表;
觸發器:觸發器,是一個表數據的變動後經過觸發器來修改與之相關聯的其餘表的數據,保證數據的一致性。使用觸發器能夠定製用戶對錶進行【增、刪、改】操做時先後的行爲,注意:沒有查詢
存儲過程是存儲在數據庫目錄中的一坨的聲明性SQL語句。
Java,Python,PHP等應用程序能夠調用存儲過程。
mysql自定義函數就是實現程序員須要sql邏輯處理,參數是IN參數,含有RETURNS字句用來指定函數的返回類型,並且函數體必須包含一個RETURN value語句。
【活動】申請成爲華爲云云享專家 尊享9大權益
【工具】SpreadJS純前端表格控件,可嵌入應用開發的在線Excel
【騰訊雲】拼團福利,AMD雲服務器8元/月
· Memcached和Redis
· Redis、RabbitMQ、Memcached
· Memcached、Redis OR Tair
· Memcached與Redis
· Redis Vs Memcached
· 愈來愈像微信的WhatsApp,能成功變現嗎?
· 這25個開源機器學習項目,通常人我不告訴Ta
· Google更新首頁塗鴉慶祝感恩節的到來
· 詳解阿里健康2019財年半年報:九成收入來自醫藥電商
· 谷歌計劃在Chrome中添加標籤滾動功能 以幫助那些標籤超載的用戶
» 更多新聞...