1. 程式人生 > >資料庫及快取重要面試題

資料庫及快取重要面試題

1、MySQL常見資料庫引擎及比較?

InnoDB:支援事務處理,支援外來鍵,支援崩潰修復能力和併發控制。如果需要對事務的完整性要求比較高(比如銀行),要求實現併發控制(比如售票),那選擇InnoDB有很大的優勢。如果需要頻繁的更新、刪除操作的資料庫,也可以選擇InnoDB,因為支援事務的提交(commit)和回滾(rollback)。

MyISAM:插入資料快,空間和記憶體使用比較低。如果表主要是用於插入新記錄和讀出記錄,那麼選擇MyISAM能實現處理高效率。如果應用的完整性、併發性要求比較低,也可以使用。

Memory:將所有資料儲存在RAM中,在需要快速查詢引用和其他類似資料的環境下,可提供極快的訪問。

注意:

  同一個資料庫也可以使用多種儲存引擎的表。如果一個表要求比較高的事務處理,可以選擇InnoDB。這個資料庫中可以將查詢要求比較高的表選擇MyISAM儲存。如果該
資料庫需要一個用於查詢的臨時表,可以選擇MEMORY儲存引擎。

更多資料庫引擎參考:https://www.cnblogs.com/li1992/articles/9217320.html

 

2、簡述資料三大正規化?

第一正規化(確保每列保持原子性)

資料表中的每一列(每個欄位),必須是不可拆分的最小單元。

第二正規化(確保表中的每列都和主鍵相關)

第二正規化需要確保資料庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。也就是說在一個數據庫表中,一個表中只能儲存一種資料,不可以把多種資料儲存在同一張資料庫表中。

第三正規化(確保每列都和主鍵列直接相關,而不是間接相關)

 

表中每一列只與主鍵直接相關而不是間接相關(每一列只能依賴於主鍵)

 

3、簡述觸發器、函式、檢視、儲存過程?

觸發器:觸發器是一個特殊的儲存過程,它是MySQL在insert、update、delete的時候自動執行的程式碼塊

函式:MySQL中提供了許多內建函式,還可以自定義函式(需要sql邏輯處理)

檢視:檢視是由查詢結果形成的一張虛擬表,是表通過某種運算得到的一個投影

儲存過程:把一段程式碼封裝起來,當要執行這一段程式碼的時候,可以通過呼叫該儲存過程來實現(經過第一次編譯後再次呼叫不需要再次編譯,比一個個執行sql語句效率高)

 

4、資料庫優化方案?

https://blog.csdn.net/jwq101666/article/details/79070773

 

5、char和varchar的區別?

char型別:定長不可變

存入字元長度大於設定長度時,會報錯;存入字元長度小於設定長度時,用空格填充剩餘長度,浪費空間,但是存取速度快。

varchar型別:可變

不使用空格填充,在真實資料前加1-2Bytes作字首,用來表示真實資料的位元組數,節省空間,存取速度較慢。

 

6、簡述MySQL的執行計劃?

# explain + SQL語句
# SQL在資料庫中執行時的表現情況,通常用於SQL效能分析,優化等場景。
 'explain select * from rbac_userinfo where id=1;'

 

7、1000w條資料,使用limit offset 分頁時,為什麼越往後翻越慢?如何解決?

http://www.cnblogs.com/zhuifeng-mayi/p/9291446.html

 

8、redis和memcached比較?

1.儲存容量:
memcached超過記憶體比例會抹掉前面的資料,而redis會儲存在磁碟
2.支援資料型別:
memcached只支援string;
redis支援更多;如:hash、list、集合、有序集合
3.持久化:
redis支援資料持久化,可以將記憶體中的資料保持在磁碟中,memcached無
4.主從:
即master-slave模式的資料備份(主從)。
5.特性
Redis在很多方面具備資料庫的特徵,或者說就是一個數據庫系統,Memcached只是簡單的K/V快取

9、redis中資料庫預設是多少個db 及作用?

#redis預設有16個db,db0~db15(可以通過配置檔案支援更多,無上限)
#並且每個資料庫的資料是隔離的不能共享
#可以隨時使用SELECT命令更換資料庫:redis> SELECT 1
# 注意:
      多個數據庫之間並不是完全隔離的
      比如FLUSHALL命令可以清空一個Redis例項中所有資料庫中的資料。

10、如果redis中的某個列表中的資料量非常大,如果實現迴圈顯示每一個值?

# 通過scan_iter分片取,減少記憶體壓力
scan_iter(match=None, count=None)增量式迭代獲取redis裡匹配的的值
# match,匹配指定key
# count,每次分片最少獲取個數
    r = redis.Redis(connection_pool=pool)
    for key in r.scan_iter(match='PREFIX_*', count=100000):
        print(key)

11、redis如何實現主從複製?以及資料同步機制?

實現主從複製:
'建立6379和6380配置檔案'
redis.conf:6379為預設配置檔案,作為Master服務配置;
redis_6380.conf:6380為同步配置,作為Slave服務配置;
'配置slaveof同步指令'
在Slave對應的conf配置檔案中,新增以下內容:
slaveof 127.0.0.1 6379
資料同步步驟:
(1)Slave伺服器連線到Master伺服器.
(2)Slave伺服器傳送同步(SYCN)命令.
(3)Master伺服器備份資料庫到檔案.
(4)Master伺服器把備份檔案傳輸給Slave伺服器.
(5)Slave伺服器把備份檔案資料匯入到資料庫中.

 

12、如何實現redis叢集?

基於【分片】來完成。

- 叢集是將你的資料拆分到多個Redis例項的過程
- 可以使用很多電腦的記憶體總和來支援更大的資料庫。
- 沒有分片,你就被侷限於單機能支援的記憶體容量。
redis將所有能放置資料的地方建立了 16384 個雜湊槽。
如果設定叢集的話,就可以為每個例項分配雜湊槽:
- 192.168.1.20【0-5000】
- 192.168.1.21【5001-10000】
- 192.168.1.22【10001-16384】

以後想要在redis中寫值時:set k1 123
- 將k1通過crc16的演算法轉換成一個數字,然後再將該數字和16384求餘,
- 如果得到的餘數 3000,那麼就將該值寫入到 192.168.1.20 例項中。

叢集方案:
- redis cluster:官方提供的叢集方案。
- codis:豌豆莢技術團隊。
- tweproxy:Twiter技術團隊。

13、MySQL 裡有 2000w 資料,redis 中只存 20w 的資料,如何保證 redis 中都是熱點資料?

限定Redis佔用的記憶體,根據自身資料淘汰策略,淘汰冷資料,把熱資料載入到記憶體。計算一下 20W 資料大約佔用的記憶體,然後設定一下Redis記憶體限制即可。

14、什麼是codis及作用?

Codis 是一個分散式 Redis 解決方案, 對於上層的應用來說,
連線到 Codis-Proxy(redis代理服務)和連線原生的 Redis-Server 沒有明顯的區別, 
上層應用可以像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉發, 不停機的資料遷移等工作, 
所有後邊的一切事情, 對於前面的客戶端來說是透明的, 可以簡單的認為後邊連線的是一個記憶體無限大的 Redis 服務.

15、什麼是twemproxy及作用?

什麼是Twemproxy
是Twtter開源的一個 Redis 和 Memcache 代理伺服器,
主要用於管理 Redis 和 Memcached 叢集,減少與Cache伺服器直接連線的數量。
他的後端是多臺REDIS或memcached所以也可以被稱為分散式中介軟體。
作用:
通過代理的方式減少快取伺服器的連線數。
自動在多臺快取伺服器間共享資料。
通過配置的方式禁用失敗的結點。
執行在多個例項上,客戶端可以連線到首個可用的代理伺服器。
支援請求的流式與批處理,因而能夠降低來回的消耗。

16、寫程式碼實現redis事務操作

import redis
pool = redis.ConnectionPool(host='10.211.55.4', port=6379)
conn = redis.Redis(connection_pool=pool)
# pipe = r.pipeline(transaction=False)
pipe = conn.pipeline(transaction=True)
# 開始事務
pipe.multi()
pipe.set('name', 'zgc')
pipe.set('role', 'haha')
pipe.lpush('roless', 'haha')
# 提交
pipe.execute()
'注意':諮詢是否當前分散式redis是否支援事務

17、什麼是一致性雜湊?python中是否有相應的模組?

一致性雜湊
一致性hash演算法(DHT)可以通過減少影響範圍的方式,解決增減伺服器導致的資料雜湊問題,從而解決了分散式環境下負載均衡問題;
如果存在熱點資料,可以通過增添節點的方式,對熱點區間進行劃分,將壓力分配至其他伺服器,重新達到負載均衡的狀態。
模組:hash_ring