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
