mysql+redis+memcached

數據庫

數據庫設計

 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

基本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

舉個小例子: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

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是變長,可變的。
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和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,不支持。

redis持久化的兩種方式

- AOF,記錄下用戶全部執行的命令。而後若是宕機了,或者出故障了,直接按照記錄下的用戶的命令就能夠保持數據完整了。(恢復時間慢,可是數據可以保持完整)
- RDB,定時持久化。就是過一段時間保存一次(恢復時間快,可是數據不必定完整)

redis默認支持主從複製

主ip只用在配置文件中寫上slaveof就行

redis的高可用(sentinel)哨兵

自動檢測主服務器是否正常
哨兵的做用簡單來講就是(主redis和復redis,主redis掛掉以後,哨兵會自動檢測到,而後都連上哨兵,哨兵會自動檢測誰死誰活,這就是哨兵的做用,另外哨兵儘可能設置三個,若是由於網絡緣由或者遇到特殊狀況的話,三個哨兵會以半數以上的方式決定這個redis是否宕機)

redis分佈式(cluster)

 - redis cluster
 - codis 
 - Twemproxy
redis中默認有16834個哈希槽

redis分佈式鎖

鏈接全部的redis服務器,在服務器上設置 k1 = 隨機字符串; 成功一半以上,表示得到鎖。
其餘人來,也會設置,可是設置時會成功 < 一半; 表示未獲取鎖,等待。
超時,鎖自動釋放。
釋放鎖;鏈接全部服務器刪除 k1=原來設置的隨機字符串 ;並且刪除的時候不是執行命令,而是刪除的是lua腳本,(由於腳本效率高)
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息