備注:自用回答
1胞枕、列舉常見的關系型數據庫和非關系型都有那些句灌?
答:http://www.cnblogs.com/zylq-blog/p/7595979.html
關系型數據庫:mysql,oracle替劈,sqlserver议泵,sqlite
關系型數據庫最典型的數據結構是表驮配,由二維表及其之間的聯系所組成的一個數據組織
優(yōu)點:
(1)易于維護:都是使用表結構熏纯,格式一致同诫;
(2)使用方便:SQL語言通用粤策,可用于復雜查詢樟澜;
(3)復雜操作:支持SQL,可用于一個表以及多個表之間非常復雜的查詢叮盘。
缺點:
(1)讀寫性能比較差秩贰,尤其是海量數據的高效率讀寫;
(2)固定的表結構柔吼,靈活度稍欠毒费;
(3)高并發(fā)讀寫需求,傳統關系型數據庫來說愈魏,硬盤I/O是一個很大的瓶頸觅玻。
非關系型數據庫:mongoDB,redis
非關系型數據庫嚴格上不是一種數據庫培漏,應該是一種數據結構化存儲方法的集合溪厘,可以是文檔或者鍵值對等。
優(yōu)點:
(1)格式靈活:存儲數據的格式可以是key,value形式牌柄、文檔形式畸悬、圖片形式等等,文檔形式珊佣、圖片形式等等蹋宦,使用靈活披粟,應用場景廣泛,而關系型數據庫則只支持基礎類型冷冗。
(2)速度快:nosql可以使用硬盤或者隨機存儲器作為載體守屉,而關系型數據庫只能使用硬盤;
(3)高擴展性蒿辙;
(4)成本低:nosql數據庫部署簡單胸梆,基本都是開源軟件。
缺點:
(1)不提供sql支持须板,學習和使用成本較高碰镜;
(2)無事務處理;
(3)數據結構相對復雜习瑰,復雜查詢方面稍欠绪颖。
非關系型數據庫的分類和比較:
(1)文檔型,如mongoDB
(2)key-value型甜奄,如redis
(3)列式數據庫
(4)圖形數據庫
2柠横、MySQL常見數據庫引擎及比較?
答:InnoDB:支持事務處理课兄,支持外鍵牍氛,支持崩潰修復能力和并發(fā)控制。如果需要對事務的完整性要求比較高(比如銀行)烟阐,要求實現并發(fā)控制(比如售票)搬俊,那選擇InnoDB有很大的優(yōu)勢。如果需要頻繁的更新蜒茄、刪除操作的數據庫唉擂,也可以選擇InnoDB,因為支持事務的提交(commit)和回滾(rollback)檀葛。?
MyISAM:插入數據快玩祟,空間和內存使用比較低。如果表主要是用于插入新記錄和讀出記錄屿聋,那么選擇MyISAM能實現處理高效率空扎。如果應用的完整性、并發(fā)性要求比較低润讥,也可以使用转锈。
MEMORY:所有的數據都在內存中,數據的處理速度快象对,但是安全性不高黑忱。如果需要很快的讀寫速度,對數據的安全性要求較低,可以選擇MEMOEY甫煞。它對表的大小有要求菇曲,不能建立太大的表。所以抚吠,這類數據庫只使用在相對較小的數據庫表常潮。
注意,同一個數據庫也可以使用多種存儲引擎的表楷力。如果一個表要求比較高的事務處理喊式,可以選擇InnoDB。這個數據庫中可以將查詢要求比較高的表選擇MyISAM存儲萧朝。如果該數據庫需要一個用于查詢的臨時表岔留,可以選擇MEMORY存儲引擎。
3检柬、簡述數據三大范式献联?
答:什么是三大范式:
第一范式:當關系模式R的所有屬性都不能在分解為更基本的數據單位時,稱R是滿足第一范式的何址,簡記為1NF里逆。滿足第一范式是關系模式規(guī)范化的最低要
求,否則用爪,將有很多基本操作在這樣的關系模式中實現不了原押。
第二范式:如果關系模式R滿足第一范式,并且R得所有非主屬性都完全依賴于R的每一個候選關鍵屬性偎血,稱R滿足第二范式诸衔,簡記為2NF。
第三范式:設R是一個滿足第一范式條件的關系模式烁巫,X是R的任意屬性集署隘,如果X非傳遞依賴于R的任意一個候選關鍵字宠能,稱R滿足第三范式亚隙,簡記為3NF.
注:關系實質上是一張二維表,其中每一行是一個元組违崇,每一列是一個屬性
4阿弃、什么是事務斩例?MySQL如何支持事務臭增?
答:原子性、一致性肥印、隔離性伴箩、持久性
在mysql中用的最多的存儲引擎有:innodb入愧,bdb,myisam ,memory 等。其中innodb和bdb支持事務而myisam等不支持事務棺蛛。
5怔蚌、簡述數據庫設計中一對多和多對多的應用場景?
答:一對多關系示例:一個學生只屬于一個班旁赊,但是一個班級有多名學生桦踊。
? ? ? ?多對多關系示例:一個學生可以選擇多門課,一門課也有多名學生终畅。
6籍胯、如何基于數據庫實現商城商品計數器?
答:如果是在非常高的并發(fā)之下离福,還是建議用內存數據庫redis去實現計數的功能杖狼。如果不是那么高的并發(fā),用表實現就可以妖爷。
https://blog.csdn.net/stevendbaguo/article/details/70889449
7本刽、常見SQL(必備)
詳見武沛齊博客:https://www.cnblogs.com/wupeiqi/articles/5729934.html
8、簡述觸發(fā)器赠涮、函數子寓、視圖、存儲過程笋除?
答:https://blog.csdn.net/running_nz/article/details/51111927
9斜友、MySQL索引種類
答:1.普通索引2.唯一索引3.主鍵索引4.組合索引5.全文索引
10、索引在什么情況下遵循最左前綴的規(guī)則垃它?
答:最左前綴原理的一部分鲜屏,索引index1:(a,b,c),只會走a国拇、a,b洛史、a,b,c?三種類型的查詢,其實這里說的有一點問題酱吝,a,c也走也殖,但是只走a字段索引,不會走c字段务热。
索引是有序的忆嗜,index1索引在索引文件中的排列是有序的,首先根據a來排序崎岂,然后才是根據b來排序捆毫,最后是根據c來排序,
11冲甘、主鍵和外鍵的區(qū)別绩卤?
答:主鍵:唯一標識一條記錄途样,不能有重復的,不允許為空
外鍵:表的外鍵是另一表的主鍵,?外鍵可以有重復的,?可以是空值
12濒憋、MySQL常見的函數娘纷?
答:sum,abs跋炕,floor
13赖晶、列舉 創(chuàng)建索引但是無法命中索引的8種情況。
答:https://blog.csdn.net/zengdeqing2012/article/details/38532217
? ? ? ?(1)如果條件中有or辐烂,即使其中有條件帶索引也不會使用(這也是為什么盡量少用or的原因)
要想使用or遏插,又想讓索引生效,只能將or條件中的每個列都加上索引
【佬蕖(2)對于多列索引胳嘲,不是使用的第一部分,則不會使用索引
】鄄荨(3)like查詢以%開頭
×伺!(4)如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引
〕矫睢(5)如果mysql估計使用全表掃描要比使用索引快,則不使用索引
14鹰祸、如何開啟慢日志查詢?
答:https://www.jb51.net/article/115372.htm
slow_query_log =1
slow_query_log_file=/application/mysql/data/localhost-slow.log
long_query_time = 1
15密浑、數據庫導入導出命令(結構+數據)蛙婴?
答:https://www.cnblogs.com/doudouxiaoye/p/5819607.html
16、數據庫優(yōu)化方案尔破?
答:https://blog.csdn.net/q602075961/article/details/71076390
17街图、char和varchar的區(qū)別?
答:char不可變字段懒构,varchar是可變字段
https://blog.csdn.net/qq_34858648/article/details/77881176
18餐济、簡述MySQL的執(zhí)行計劃?
答:https://blog.csdn.net/heng_yan/article/details/78324176
MySql提供了EXPLAIN語法用來進行查詢分析胆剧,在SQL語句前加一個"EXPLAIN"即可
19絮姆、在對name做了唯一索引前提下,簡述以下區(qū)別:
答:過濾出數據的同時赞赖,進行計數
20滚朵、1000w條數據,使用limit offset 分頁時前域,為什么越往后翻越慢?如何解決韵吨?
答:?先查主鍵匿垄,在分頁。 select * from tb where id in(select id from tb where limit 10 offset 20)
21、什么是索引合并椿疗?
答:索引合并漏峰,讓一條sql可以使用多個索引。對這些索引取交集届榄,并集浅乔,或者先取交集再取并集。從而減少從數據表中取數據的次數铝条,提高查詢效率靖苇。
22、什么是覆蓋索引班缰?
答:如果一個索引包含(或覆蓋)所有需要查詢的字段的值贤壁,稱為‘覆蓋索引’
23、簡述數據庫讀寫分離埠忘?
答:主服務器master記錄數據庫操作日志到Binary log脾拆,從服務器開啟i/o線程將二進制日志記錄的操作同步到relay log(存在從服務器的緩存中),另外sql線程將relay log日志記錄的操作在從服務器執(zhí)行莹妒。?
24名船、簡述數據庫分庫分表?(水平旨怠、垂直)
答:(1)數據庫分表
??? 把一張表按照一定的規(guī)則分解成不同的實體表包帚。比如垂直劃分和水平劃分
? 垂直切分:把不同功能,不同模塊的數據分別放到不同的表中运吓,但是如果同一個模塊的數據量太大就會存在性能瓶頸
水平切分:垂直切分解決不了大表的瓶頸渴邦,如果同一個功能中表的數據量過大,就要對該表進行切分拘哨,為水平切分
通俗理解:垂直切分---分不同的模塊表谋梭;水平切分---分同一個模塊下的多個表
(2)分庫
將一堆數據放到不同的數據庫中保存,上面說的都是在同一個數據庫上倦青,分庫是分到不同的數據庫上
25瓮床、redis和memcached比較?
答:(1)?Redis不僅僅支持簡單的k/v類型的數據产镐,同時還提供list隘庄,set,hash等數據結構的存儲癣亚。
(2)Redis支持數據的備份丑掺,即master-slave模式的數據備份。
(3)Redis支持數據的持久化述雾,可以將內存中的數據保持在磁盤中街州,重啟的時候可以再次加載進行使用兼丰。
26、redis中數據庫默認是多少個db 及作用唆缴?
答:當redis 服務器初始化時鳍征,會預先分配 16 個數據庫(該數量可以通過配置文件配置),所有數據庫保存到結構 redisServer 的一個成員 redisServer.db 數組中面徽。當我們選擇數據庫 select number 時艳丛,程序直接通過 redisServer.db[number] 來切換數據庫。有時候當程序需要知道自己是在哪個數據庫時趟紊,直接讀取 redisDb.id 即可氮双。
27、python操作redis的模塊织阳?
答:https://www.cnblogs.com/xtsec/p/7000404.html
導入redis眶蕉,鏈接redis數據庫,對redis api的使用
28唧躲、如果redis中的某個列表中的數據量非常大造挽,如果實現循環(huán)顯示每一個值?
答:可以嘗試將對象分拆成幾個key-value弄痹, 使用multiGet獲取值饭入,這樣分拆的意義在于分拆單次操作的壓力,將操作壓力平攤到多個redis實例中肛真,降低對單個redis的IO影響谐丢; ? ?
29、redis如何實現主從復制蚓让?以及數據同步機制乾忱?
答:Redis的主從同步機制可以確保redis的master和slave之間的數據同步
全備份過程中,在slave啟動時历极,會向其master發(fā)送一條SYNC消息窄瘟,master收到slave的這條消息之后,將可能啟動后臺進程進行備份趟卸,備份完成之后就將備份的數據發(fā)送給slave
30蹄葱、redis中的sentinel的作用?
答:用于監(jiān)控redis集群中Master狀態(tài)的工具
31锄列、如何實現redis集群图云?
答:Redis集群設計包括2部分:哈希Slot和節(jié)點主從
主從模式的設計:
優(yōu)點:讀寫分離,通過增加Slaver可以提高并發(fā)讀的能力邻邮。
缺點:Master寫能力是瓶頸竣况。
?????????雖然理論上對Slaver沒有限制但是維護Slaver開銷總將會變成瓶頸。
?????????Master的Disk大小也將會成為整個Redis集群存儲容量的瓶頸饶囚。
哈希Slot的優(yōu)缺點:
缺點:每個Node承擔著互相監(jiān)聽帕翻、高并發(fā)數據寫入鸠补、高并發(fā)數據讀出萝风,工作任務繁重
優(yōu)點:將Redis的寫操作分攤到了多個節(jié)點上嘀掸,提高寫的并發(fā)能力,擴容簡單规惰。
32睬塌、redis中默認有多少個哈希槽?
答:16384?個哈希槽
33歇万、簡述redis的有哪幾種持久化策略及比較揩晴?
答:rdb:快照形式是直接把內存中的數據保存到一個dump文件中,定時保存贪磺,保存策略
? ? ? ? aof:把所有的對redis的服務器進行修改的命令都存到一個文件里硫兰,命令的集合
34、列舉redis支持的過期策略寒锚。
答:volatile-lru:只對設置了過期時間的key進行LRU(默認值)?
allkeys-lru?:?刪除lru算法的key ??
volatile-random:隨機刪除即將過期key ??
allkeys-random:隨機刪除???
volatile-ttl?:?刪除即將過期的 ??
noeviction?:?永不過期劫映,返回錯誤??
35、MySQL 里有 2000w 數據刹前,redis 中只存 20w 的數據泳赋,如何保證 redis 中都是熱點數據??
答:redis 內存數據集大小上升到一定大小的時候喇喉,就會施行數據淘汰策略祖今。redis 提供 6種數據淘汰策略:?
volatile-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(驅逐):禁止驅逐數據
36、寫代碼拣技,基于redis的列表實現 先進先出千诬、后進先出隊列、優(yōu)先級隊列膏斤。
答:請求的優(yōu)先級徐绑。我們先假設一個最簡單的場景,有三個優(yōu)先級:高中低三級掸绞”萌可以設置3個list結構,比如叫queue_h衔掸,queue_m烫幕,queue_l,分別對應三個優(yōu)先級敞映。
37较曼、如何基于redis實現消息隊列?
答:使用lpush向list的左端推送數據(發(fā)送消息)振愿,使用rpop從右端接收數據(消費消息)
38捷犹、如何基于redis實現發(fā)布和訂閱弛饭?以及發(fā)布訂閱和消息隊列的區(qū)別?
答:“發(fā)布/訂閱”模式包含兩種角色萍歉,分別是發(fā)布者和訂閱者侣颂。訂閱者可以訂閱一個或若干個頻道(channel),而發(fā)布者可以向指定的頻道發(fā)送消息枪孩,所有訂閱此頻道的訂閱者都會收到此消息憔晒。
39、什么是codis及作用蔑舞?
答:Codis是一個分布式的Redis解決方案拒担,對于上層的應用來說,連接Codis Proxy和連接原生的Redis Server沒有明顯的區(qū)別攻询,上層應用可以像使用單機的Redis一樣使用从撼,Codis底層會處理請求的轉發(fā),不停機的數據遷移等工作钧栖,所有后邊的一切事情低零,對于前面客戶端來說是透明的,可以簡單的認為后邊連接是一個內存無限大的Redis服務桐经。
業(yè)務需要毁兆,數據可能需要遷移,機器橫向擴容
經過線上測試阴挣,Codis的升級版Reborn在pipline操作的性能比Codis慢了幾十倍
40气堕、什么是twemproxy及作用?
答:twemproxy是 Twtter 開源的一個 Redis 和 Memcache 代理服務器畔咧,主要用于管理 Redis 和 Memcached 集群茎芭,減少與Cache 服務器直接連接的數量。
41誓沸、寫代碼實現redis事務操作梅桩。
答:Redis會將一個事務中的所有命令序列化,然后按順序執(zhí)行
42拜隧、redis中的watch的命令的作用宿百?
答:當某個事務需要按條件執(zhí)行時,就要使用這個命令將給定的鍵設置為受監(jiān)控的
43洪添、基于redis如何實現商城商品數量計數器垦页?
答:https://www.cnblogs.com/JockChou/p/4647973.html
44、簡述redis分布式鎖和redlock的實現機制干奢。
45痊焊、什么是一致性哈希?Python中是否有相應模塊?
46薄啥、如何高效的找到redis中所有以oldboy開頭的key辕羽?