天天看點

reids mysql 面試_mysql和redis面試準備(1)

1、主鍵索引和唯一索引有什麼差別?

答:(1)主鍵是一種限制,唯一索引是一種索引,兩者在本質上是不同的。

(2)主鍵建立後一定包含一個唯一性索引,唯一性索引并不一定就是主鍵。

(3)唯一性索引列允許空值,而主鍵列不允許為空值。

(4)主鍵可以被其他表引用為外鍵,而唯一索引不能。

(5)一個表最多隻能建立一個主鍵,但可以建立多個唯一索引。

(6)主鍵更适合那些不容易更改的唯一辨別,如自動遞增列、身份證号等。

參考文檔:https://www.cnblogs.com/-619569179/p/6528896.html

2、MySQL事務隔離級别有哪幾種,預設是什麼,分别解決了什麼問題?

答:(1)預設級别是可重複讀

(2)未送出讀、送出讀(解決了髒讀問題)、可重複讀(解決了髒讀和不可重複讀問題)、串行化讀(解決了髒讀和不可重複讀、幻讀問題)

(3)髒讀:事務A讀取了事務B更新的資料,然後B復原操作,那麼A讀取到的資料是髒資料

不可重複讀:事務 A 多次讀取同一資料,事務 B 在事務A多次讀取的過程中,對資料作了更新并送出,導緻事務A多次讀取同一資料時,結果 不一緻。

幻讀:系統管理者A将資料庫中所有學生的成績從具體分數改為ABCDE等級,但是系統管理者B就在這個時候插入了一條具體分數的記錄,當系統管理者A改結束後發現還有一條記錄沒有改過來,就好像發生了幻覺一樣,這就叫幻讀。

小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重于修改,幻讀側重于新增或删除。解決不可重複讀的問題隻需鎖住滿足條件的行,解決幻讀需要鎖表

參考文檔:https://www.cnblogs.com/huanongying/p/7021555.html

3、聚簇索引和非聚簇索引的有什麼不同?

答:(1)聚集索引的實體順序和索引順序一緻,非聚集索引的實體順序和索引順序不一緻

(2)先建立聚集索引,然後才能建立非聚集索引

(3)一個表隻能有一個聚集索引,但是可以有多個非聚集索引

(4)在聚集索引中,資料存儲在B+樹的葉子節點上,而非聚集索引的葉子節點存放的是索引值而不是資料

(5)InnoDB是聚簇索引,MyISAM是非聚簇索引

參考文檔:https://blog.csdn.net/chunlongyu/article/details/53360383

4、講一下樂觀鎖和悲觀鎖,樂觀鎖是怎麼保證一緻性的?

答:(1)悲觀鎖:總是假設最壞的情況,每次去拿資料的時候都認為别人會修改,是以每次在拿資料的時候都會上鎖,這樣别人想拿這個資料就會阻塞直到它拿到鎖。傳統的關系型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。再比如Java裡面的同步原語synchronized關鍵字的實作也是悲觀鎖。

(2)樂觀鎖:顧名思義,就是很樂觀,每次去拿資料的時候都認為别人不會修改,是以不會上鎖,但是在更新的時候會判斷一下在此期間别人有沒有去更新這個資料。樂觀鎖通過版本号檢查保證資料的一緻性。

參考文檔:http://wenkunet.com/p-45711.html

5、mysql索引失效的情況?(或者說哪些字段不适合建立索引)

答:索引失效會變成全表掃描,如聯合索引的字首比對,跳躍索引,聚合函數,判空和<>這些情況。

where後面查詢的條件:

(1)like模糊查詢以%号開頭

(2)使用or條件,但是or條件的左右兩邊,有一個沒有使用索引,則索引失效

(3)索引查詢條件使用了聚合函數,判斷是否為空

(4)如果列類型為字元串,但是查詢沒有用引号引起來,則索引失效

(5)查詢條件裡面有!=号,或者小于大于号

(6)頻繁進行更新的字段不适合建立索引

參考文檔:https://blog.csdn.net/u014222774/article/details/54923483

6、如何建立索引?在哪些字段适合建立索引?

答:create index index_name on table.field

(1)經常查詢的字段上

(2)where字句後面的字段、group by、order by、distinct

(3)主鍵字段、外鍵字段

(4)經常與其他表進行連接配接的表,在連接配接字段上應該建立索引

7、MyISAM與InnoDB事務引擎差別?應用場景分别是什麼?為什麼MyISAM會比Innodb的查詢速度快?

答:(1)myisam支援表鎖,innodb支援行鎖;

(2)myisam查詢效率高,innodb寫入效率高;

(3)myisam不支援事務,innodb支援事務;

(4)myisam不支援外鍵,innodb支援外鍵;

(5)myisam支援全文索引,innodb不支援全文索引;

(6)MyISAM适合:(1)做很多count的計算;(2)插入不頻繁,查詢非常頻繁;(3)沒有事務。

InnoDB适合:(1)可靠性要求比較高,或者要求事務;(2)表更新和查詢都相當的頻繁,并且行鎖定的機會比較大的情況。

(7)INNODB在做SELECT的時候,要維護的東西比MYISAM引擎多很多;INNODB要緩存資料塊和索引塊,MYISAM隻緩存索引塊, 這中間還有換進換出的減少; innodb尋址要映射到塊,再到行,MYISAM 記錄的直接是檔案的OFFSET,定位比INNODB要快;INNODB還需要維護MVCC(Multi-Version Concurrency Control多版本并發控制 )一緻;雖然你的場景沒有,但他還是需要去檢查和維護。

(8)myisam是非聚集索引,Innodb是聚集索引

參考文檔:https://www.cnblogs.com/changna1314/p/6878900.html

8、如何了解最左字首比對原則?

答:(1)where語句之後查詢的第一個字段要是建立索引的第一個字段

(2)最左字首:顧名思義,就是最左優先,使用SQL語句(alter table table_name add index index_name(lname,fname,age) )建立了lname_fname_age多列索引,相當于建立了(lname)單列索引,(lname,fname)組合索引以及(lname,fname,age)組合索引。

(3)建立多列索引時,通常把第一列用在最頻繁查詢的字段上,這樣執行效率會比較高

參考文檔:https://www.cnblogs.com/jamesbd/p/4333901.html

9、SQL語句中count(1)和count(*)的差別?

答:(1)當要統計的數量比較大時,發現count(*)花費的時間比較多,相對來說count(1)花費的時間比較少。

(2)執行效率問題,因為使用count(*)的時候會對所有的列進行掃描,相比而言count(1)不用掃描所有列,是以count(1)要快一些。

參考文檔:https://www.cnblogs.com/sueris/p/6650301.html

10、B樹與B+樹的差別?innoDB的B+樹索引葉子節點的Data域存儲的是什麼?MyISAM的B+樹索引葉子節點的Data域存儲的是主鍵還是實體位址?

答:(1)B樹:每個節點都存儲key和data,所有節點組成這棵樹,并且葉子節點指針為null。B+樹:隻有葉子節點存儲data,葉子節點包含了這棵樹的所有鍵值,葉子節點不存儲指針

(2)innodb是聚集索引,myisam是非聚集索引。

(3)innodb的data域存的是資料本身,索引也是資料;myisam的data域存的是資料實體位址,索引是索引,資料是資料。

參考文檔:https://blog.csdn.net/zhuanzhe117/article/details/78039692

11、mysql如何查詢每個使用者當天的使用者訂單量?

答:select datediff('2018-08-09','2015-08-10');

參考文檔:https://www.cnblogs.com/nick-huang/p/4447717.html

12、說說redis的應用場景?

答:(1)計數器,利用key-value的資料類型

(2)隊列,利用它的釋出訂閱模式

(3)緩存伺服器,利用它的資料儲存在記憶體中的優勢

(4)排行榜,利用它的zset有序集合的資料類型

(5)最新新聞或資料顯示,利用它的list資料類型,通過lpush最新的資料

(6)共同愛好,利用它的set集合資料類型

(7)redis能做分布式鎖,這點也很關鍵的,主要是保證分布式系統中的資料一緻性問題

參考文檔:https://www.cnblogs.com/NiceCui/p/7794659.html

13、Redis的哨兵講一下?

答:Sentinel(哨兵)程序是用于監控redis叢集中Master主伺服器工作的狀态,在Master主伺服器發生故障的時候,可以實作Master和Slave伺服器的切換,保證系統的高可用,一般在生産環境也建議使用Redis的2.8版本的以後版本。哨兵(Sentinel) 是一個分布式系統,你可以在一個架構中運作多個哨兵(sentinel) 程序,這些程序使用流言協定(gossipprotocols)來接收關于Master主伺服器是否下線的資訊,并使用投票協定(Agreement Protocols)來決定是否執行自動故障遷移,以及選擇哪個Slave作為新的Master。每個哨兵(Sentinel)程序會向其它哨兵(Sentinel)、Master、Slave定時發送消息,以确認對方是否”活”着,如果發現對方在指定配置時間(可配置的)内未得到回應,則暫時認為對方已掉線,也就是所謂的”主觀認為當機” 。當“哨兵群”中的多數Sentinel程序在對Master主伺服器做出 SDOWN 的判斷,并且通過 SENTINEL is-master-down-by-addr 指令互相交流之後,得出的Master Server下線判斷,這種方式就是“客觀當機”,通過一定的vote算法,從剩下的slave從伺服器節點中,選一台提升為Master伺服器節點,然後自動修改相關配置,并開啟故障轉移(failover)。

參考文檔:https://www.cnblogs.com/PatrickLiu/p/8444546.html

14、給你一個表(資料很大),有使用者名和資料,如何快速檢索某條資料?

答:(1)對索引排序+二分查找。對索引建表,在新表裡可以用hash、分區等操作。

(2)使用全文索引fullindex

(3)根據時間區段來進行查詢,效率會高些

參考文檔:https://www.nowcoder.com/discuss/95157?type=0&order=0&pos=9&page=1

15、redis資料類型有哪些?

答:Redis支援五種資料類型:Redis不僅僅支援簡單的key-value類型的資料,同時還提供list,set,zset,hash等資料結構的存儲。

值可以是string(字元串,就是Key-Value類型的),hash(哈希),list(清單),set(集合)及zset(sorted set:有序集合)

參考文檔:http://www.runoob.com/redis/redis-data-types.html

此篇文章,還有20道題目,在我的面經中,詳情看下面。

我會持續更新面試題目,包括linux,前端(vue,jquery,css)、python、mysql和redis的面經題目,後期加入golang。可以加我qq 2093905919或者微信 18828004657,跟我聊聊。(注:可以分享一部分面試題目,覺得可以的話,剩下的全部面試題目(多年經驗,非常多而廣的題目,适合突擊面試複習,适合運維工程師,python工程師,運維開發,甚至前端開發(vue,asp,jquery)等等),需要打賞200元,絕對物超所值)

reids mysql 面試_mysql和redis面試準備(1)