數據庫及緩存重要面試題


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM