a. 單表
b. FK(單表;一張表存儲時,若是有重複出現的字段爲了防止硬盤的浪費,因此作一個FK;去掉FK變成單表(這樣子訪問速度快了))
c. M2M(多對多關係)
究竟是什麼關係?
單選的下拉框/radio FK;多選下拉框/checkbox M2M
舉個小例子:mysql
問題:員工信息表員工當前薪資;保留員工的全部的調薪記錄。
思路一:兩張表
員工表:
id name salary
調薪:
id price time 員工ID
思路二:三張表
員工表:
id name salary
調薪:
id price time
員工調薪表:
id uid sid
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
舉個小例子:redis
數據: 部門表: 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
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語句獲取動態的數據集,併爲其命名】,用戶使用時只需使用【名稱】便可獲取結果集,並能夠將其看成表來使用。
存儲過程是一個SQL語句集合,當主動去調用存儲過程時,其中內部的SQL語句會按照邏輯執行。
mysql自定義函數就是實現程序員須要sql邏輯處理,參數是IN參數,含有RETURNS字句用來指定函數的返回類型,並且函數體必須包含一個RETURN value語句。
觸發器:對某個表進行【增/刪/改】操做的先後若是但願觸發某個特定的行爲時,可使用觸發器,觸發器用於定製用戶對錶的行進行【增/刪/改】先後的行爲。
事務用於將某些操做的多個SQL做爲原子性操做,一旦有某一個出現錯誤,便可回滾到原來的狀態,從而保證數據庫數據完整性。
- like '%xx' select * from tb1 where name like '%cn'; - 使用函數 select * from tb1 where reverse(name) = 'wupeiqi'; - or select * from tb1 where nid = 1 or email = 'seven@live.com'; 特別的:當or條件中有未創建索引的列才失效,如下會走索引 select * from tb1 where nid = 1 or name = 'seven'; select * from tb1 where nid = 1 or email = 'seven@live.com' and name = 'alex' - 類型不一致 若是列是字符串類型,傳入條件是必須用引號引發來,否則... select * from tb1 where name = 999; - != select * from tb1 where name != 'alex' 特別的:若是是主鍵,則仍是會走索引 select * from tb1 where nid != 123 - > select * from tb1 where name > 'alex' 特別的:若是是主鍵或索引是整數類型,則仍是會走索引 select * from tb1 where nid > 123 select * from tb1 where num > 123 - order by select email from tb1 order by name desc; 當根據索引排序時候,選擇的映射若是不是索引,則不走索引 特別的:若是對主鍵排序,則仍是走索引: select * from tb1 order by nid desc; - 組合索引最左前綴 若是組合索引爲:(name,email) name and email -- 使用索引 name -- 使用索引 email -- 不使用索引
關係型數據庫和非關係型數據庫:
關係型數據庫:MySQL、SQLite、SQLServer、access、oracle、db2
非關係型數據庫:redis、memcached、mongodb
持久化存到文件中:
MySQL、SQLite、mongodb、SQLServer、access、oracle、db2
持久化存到內存中的是:
redis、memcached
相同點:都是將數據保存到內存,存取速度都比較快。 本身想:在內存中存在一個大字典,你對字典進行操做。
不一樣點: - 數據類型: - redis,5大數據類型 { k1:v1, k2:[11,22], k3:{ kk1:vv1, kk2:vv2, }, k4: {1,2,3}, k5: {('alex',8),('oldboy',5)} } - memcached,1中類型:字符串 { k1:v1, } - 持久化 - redis,支持持久化 - memcached,不支持。 - 集羣架構 - redis,支持 - memcached,不支持。 - 自動過時策略 - redis,支持 voltile-lru:從已設置過時時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰 volatile-ttl:從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據淘汰 volatile-random:從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據淘汰 allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰 allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰 no-enviction(驅逐):禁止驅逐數據 - memcached,不支持。
- AOF,記錄下用戶全部執行的命令。而後若是宕機了,或者出故障了,直接按照記錄下的用戶的命令就能夠保持數據完整了。(恢復時間慢,可是數據可以保持完整)
- RDB,定時持久化。就是過一段時間保存一次(恢復時間快,可是數據不必定完整)
主ip只用在配置文件中寫上slaveof就行
自動檢測主服務器是否正常
哨兵的做用簡單來講就是(主redis和復redis,主redis掛掉以後,哨兵會自動檢測到,而後都連上哨兵,哨兵會自動檢測誰死誰活,這就是哨兵的做用,另外哨兵儘可能設置三個,若是由於網絡緣由或者遇到特殊狀況的話,三個哨兵會以半數以上的方式決定這個redis是否宕機)
- redis cluster - codis - Twemproxy
redis中默認有16834個哈希槽
鏈接全部的redis服務器,在服務器上設置 k1 = 隨機字符串; 成功一半以上,表示得到鎖。 其餘人來,也會設置,可是設置時會成功 < 一半; 表示未獲取鎖,等待。 超時,鎖自動釋放。 釋放鎖;鏈接全部服務器刪除 k1=原來設置的隨機字符串 ;並且刪除的時候不是執行命令,而是刪除的是lua腳本,(由於腳本效率高)