繼續分享最新的面經,面試的崗位是上海某公司的Golang開發崗,給的薪資范圍是20~40K,對mongodb
要求熟練掌握,所以面試過程中對于mongodb
也問的比較多。
下面是我整理好的面經(去除了項目相關的問題):
- 自我介紹?
2. mongodb查詢優化講一下?
可以從以下幾個方面展開:
-
索引的使用:
- 索引是查詢優化的核心。MongoDB支持多種索引類型(如單字段索引、復合索引、全文索引等)。合理創建索引可以顯著提高查詢性能。
- 使用
explain()
方法分析查詢計劃,查看是否使用了索引以及索引的效率。
-
查詢語句優化:
- 避免全表掃描:確保查詢條件能夠命中索引。
- 盡量減少返回的數據量,使用
projection
只返回需要的字段。 - 對于復雜的查詢,可以通過拆分查詢或使用聚合管道來優化。
-
分片與副本集:
- 分片可以將數據分布在多個節點上,從而提高查詢性能。
- 副本集主要用于高可用性,但讀操作可以分擔到從節點以減輕主節點的壓力。
-
硬件和配置優化:
- 調整MongoDB的內存分配和緩存策略,充分利用服務器資源。
- 定期監控數據庫性能,使用工具如MongoDB Atlas或第三方監控工具定位瓶頸。
-
寫操作優化:
- 批量寫入比單條寫入更高效。
- 在高并發場景下,考慮調整寫關注級別(Write Concern)以平衡性能和一致性。
3. mongodb和mysql的索引特性上有什么區別?
-
索引類型:
- MongoDB支持多種索引類型,包括單字段索引、復合索引、地理空間索引、全文索引和哈希索引。
- MySQL主要支持B+樹索引(InnoDB和MyISAM引擎),此外還有全文索引、哈希索引(Memory引擎)等。
-
索引存儲結構:
- MongoDB默認使用B樹作為索引結構,適合范圍查詢和排序。
- MySQL的InnoDB引擎使用B+樹,更適合范圍查詢和順序訪問。
-
索引覆蓋:
- MongoDB支持索引覆蓋查詢(Index-Only Query),即如果查詢的所有字段都在索引中,則無需訪問文檔本身。
- MySQL同樣支持索引覆蓋,但需要確保查詢字段完全包含在索引中。
-
唯一性約束:
- MongoDB允許在集合中創建唯一索引,但分布式環境下的唯一性約束需要額外注意。
- MySQL的唯一索引在單機和分布式環境下都更容易實現。
-
性能影響:
- MongoDB的寫操作會在寫入文檔的同時更新索引,可能會對性能產生一定影響。
- MySQL的索引維護成本較高,尤其是在大規模更新或插入時。
4. mongodb設計索引上跟mysql有什么區別?
-
數據模型差異:
- MongoDB是文檔型數據庫,數據以嵌套的JSON格式存儲,因此可以在嵌套字段上創建索引。
- MySQL是關系型數據庫,數據以表格形式存儲,索引設計通常基于列。
-
復合索引的設計:
- MongoDB的復合索引順序非常重要,查詢條件必須按照索引定義的順序匹配才能生效。
- MySQL的復合索引也有順序要求,但其查詢優化器會嘗試重排條件以匹配索引。
-
動態模式的支持:
- MongoDB支持動態模式,索引設計需要考慮文檔結構的多樣性。
- MySQL的表結構是固定的,索引設計相對簡單。
-
分布式環境:
- MongoDB的分片集群需要為分片鍵創建索引,且分片鍵的選擇對性能有重大影響。
- MySQL在分布式環境中通常通過中間件(如ShardingSphere)實現分片,索引設計不受分片鍵限制。
-
索引大小的考慮:
- MongoDB的索引存儲在內存中,過大的索引可能導致性能下降。
- MySQL的索引也占用內存,但其B+樹結構更節省空間。
5. mongodb在創建索引和使用上有什么注意事項嗎?
-
選擇合適的字段:
- 根據查詢頻率和數據分布選擇索引字段,避免為低頻查詢創建索引。
- 復合索引的字段順序應根據查詢條件的重要性排列。
-
索引的維護成本:
- 創建索引會增加寫操作的開銷,因為每次寫入都需要更新索引。
- 刪除不必要的索引以減少維護成本。
-
索引的覆蓋能力:
- 盡量設計索引以支持覆蓋查詢,減少文檔訪問次數。
-
內存限制:
- 索引需要加載到內存中才能高效工作,因此索引大小不能超過可用內存。
-
后臺創建:
- 在生產環境中創建索引時,建議使用后臺模式(
background: true
),以避免阻塞其他操作。
- 在生產環境中創建索引時,建議使用后臺模式(
-
分片集群的特殊要求:
- 分片集群需要為分片鍵創建索引,并確保分片鍵的選擇均衡分布數據。
6. mongodb和mysql主鍵的區別?主鍵會帶來什么影響?
-
主鍵的生成方式:
- MongoDB默認為主鍵字段
_id
生成一個唯一的ObjectId值,也可以自定義主鍵。 - MySQL的主鍵通常由用戶指定,或者由自增列(AUTO_INCREMENT)生成。
- MongoDB默認為主鍵字段
-
主鍵的作用:
- MongoDB的主鍵用于唯一標識文檔,同時也是集合的默認索引。
- MySQL的主鍵用于唯一標識行,同時是表的聚集索引(InnoDB引擎)。
-
性能影響:
- MongoDB的主鍵索引會影響查詢和寫入性能,尤其是當主鍵是隨機生成的ObjectId時,可能導致頻繁的頁分裂。
- MySQL的主鍵直接影響數據存儲的物理順序,連續遞增的主鍵有助于提高插入性能。
-
分布式環境:
- MongoDB的主鍵在分片集群中需要結合分片鍵使用。
- MySQL的主鍵在分布式環境中可能需要額外的協調機制。
7. kafka怎么保障kafka消息可靠性?
-
持久化:
- Kafka將消息持久化到磁盤,確保即使發生故障也能恢復數據。
- 通過配置
acks
參數,可以控制消息的確認級別(如acks=1
、acks=all
)。
-
副本機制:
- Kafka使用分區副本(Partition Replication)來保證數據的冗余。
- ISR(In-Sync Replica)機制確保只有同步完成的副本才能參與選舉。
-
消息確認:
- 生產者可以通過
acks
參數設置消息的確認級別,確保消息被成功寫入。
- 生產者可以通過
-
消費者確認:
- 消費者通過手動提交偏移量(Offset)確保消息被正確處理。
-
事務支持:
- Kafka支持事務性消息,確保跨分區的消息一致性。
8. kafka怎么保證消息冪等?
-
生產者冪等性:
- Kafka引入了冪等性生產者(Idempotent Producer),通過為每個生產者分配唯一的PID(Producer ID)和序列號(Sequence Number)來確保每條消息只被寫入一次。
-
事務支持:
- Kafka支持事務性消息,允許跨分區和主題的消息原子性提交。
-
消費者端處理:
- 消費者可以通過去重邏輯(如基于消息ID)避免重復處理。
9. 怎么限制goroutine的上限?
-
使用信號量(Semaphore):
- 使用
sync.WaitGroup
或chan struct{}
實現信號量,限制并發goroutine的數量。
- 使用
-
使用Worker Pool模式:
- 創建固定數量的worker goroutine,任務通過隊列分發給這些worker。
-
使用第三方庫:
- 使用類似
ants
這樣的協程池庫,直接設置最大goroutine數量。
- 使用類似
10. sync.map的實現介紹一下?
sync.Map
是 Go 標準庫中提供的一個并發安全的 map 實現,旨在優化高并發環境下的讀寫性能。它特別適合于讀多寫少的場景,并通過內部機制減少鎖競爭來提高效率。
核心數據結構
-
read
:這是一個只讀緩存,包含一部分或全部的數據副本。它是無鎖訪問的,因此讀操作非常快。 -
dirty
:這是一個可寫的緩存,包含了所有鍵值對(包括那些在read
中沒有但新添加的)。由于需要支持寫入,訪問dirty
時會涉及到加鎖操作。 -
entry
:這是存儲實際鍵值對的結構體。它支持原子操作,允許高效地更新或刪除值而無需鎖。
工作機制
-
讀操作
- 當進行讀取時,優先從
read
中查找數據。因為read
是無鎖的,所以讀取速度很快。 - 如果
read
中找不到且有未遷移至read
的數據,則檢查dirty
。這時需要加鎖,但這種情況相對較少。
- 當進行讀取時,優先從
-
寫操作
- 寫入已存在的鍵值對時,嘗試直接更新
read
中對應的條目。這通常可以通過原子操作完成,避免了加鎖。 - 對于新增的鍵值對,則會添加到
dirty
緩存中。如果dirty
尚未初始化,會先將read
中的數據復制到dirty
。
- 寫入已存在的鍵值對時,嘗試直接更新
-
數據遷移
- 隨著時間推移,
dirty
可能積累大量未遷移到read
的數據。當達到一定條件時,sync.Map
會觸發一次數據遷移,將dirty
提升為新的read
并清空舊的dirty
。
- 隨著時間推移,
-
刪除操作
- 刪除操作不是立即從
read
或dirty
中移除數據,而是標記相應的entry
為已刪除。這樣可以延遲清理工作,減少內存分配和回收的開銷。
- 刪除操作不是立即從
適用場景
- 讀多寫少:在這種情況下,
sync.Map
的設計能夠最大化利用其無鎖讀的優勢。 - 動態數據集:適用于鍵值對集合經常變化的應用場景。
- 高并發環境:提供了一種高效的并發控制方式,減少了鎖爭用。
注意事項
- 雖然
sync.Map
在讀多寫少的情況下表現優異,但在寫密集型應用中可能不如使用傳統同步方法(如手動加鎖)那樣有效。 - 應謹慎評估你的應用場景是否適合使用
sync.Map
,特別是當你預計會有大量的新鍵值對插入時。
歡迎關注 ?
我們搞了一個免費的面試真題共享群,互通有無,一起刷題進步。
沒準能讓你能刷到自己意向公司的最新面試題呢。
感興趣的朋友們可以私信我,備注:面試群。