2025年11月3日 星期一

🕵️ 資料庫與 PHP 資深工程師面試:你掉進「陷阱題」了嗎?

🕵️ 資料庫與 PHP 資深工程師面試:你掉進「陷阱題」了嗎?

作為資深架構師,我整理了這份面試中常見的陷阱題清單。這些問題的目標不是測試知識廣度,而是深入檢驗你對系統細節、工程權衡與風險邊界的掌握。如果你只會背誦答案,將會露出破綻。

一、 精度與型別:浮點陷阱與資料正確性

1. 題目:WHERE price = 0.1,能找到 DECIMAL(10,2)DOUBLE 存的值嗎?為什麼?

面試官想測什麼?理想回答要點紅旗警告 (Red Flag)
關鍵: 儲存型別的差異、浮點數近似儲存的理解、實際業務場景(金額)的處理。結論: DECIMAL 可以,DOUBLE 極可能失敗。細節: DECIMAL 採用精確的十進位儲存,故 0.1 就是 0.1。DOUBLE 採用二進位浮點數儲存,0.1 無法精確表示,儲存的是一個近似值(如 $0.10000000000000000555$),導致精確比對失敗。替代: 應用層所有金額運算都應使用 BCMath 或將金額整數化儲存(單位:分),DB 端必須使用 DECIMAL只回答「因為浮點不準確」,但沒有提到 DECIMAL 的正確性,也沒說明應用層的具體解決方案。

2. 題目:floor((0.7+0.1)*10) 在 PHP/MySQL/JS 結果是否相同?

面試官想測什麼?理想回答要點紅旗警告 (Red Flag)
關鍵: 跨語言/DB 環境下的浮點行為不一致性四捨五入(Rounding) 的差異。結論: 不盡相同,可能得到 7 或 8。細節: 在 PHP 標準浮點運算中 0.7+0.1 可能約等於 $0.7999999999999999$;乘以 10 再取 floor 會得到 7 (因為浮點數儲存偏差)。解決: 使用 PHP 的 BCMath 擴展進行高精度運算,或將其轉換為整數再運算,結果應為 8。DB 端的 DECIMAL 運算結果也是 8。籠統地說「不相同」,但沒能具體說出 PHP 浮點運算可能產生的 7 這個錯誤結果,或沒有提到 BCMath。

二、 交易與鎖:死鎖、分佈式與一致性陷阱

3. 題目:在兩個資料庫連線分別執行 SELECT ... FOR UPDATE,會發生什麼?如何避免死鎖?

面試官想測什麼?理想回答要點紅旗警告 (Red Flag)
關鍵: 行鎖(Row Lock)鎖順序(Lock Order)死鎖偵測與重試機制的實戰理解。結論: 可能發生 鎖等待,若兩事務交叉鎖定,則引發 死鎖(Deadlock)細節: FOR UPDATE 是悲觀鎖,會阻止其他事務讀寫鎖定行。死鎖的唯一預防確保所有事務以相同的順序鎖定資源(例如,總是先鎖 ID 小的行)。替代: 讓交易儘可能短;設置合理的重試機制(帶指數退避),並在重試前徹底回滾失敗交易。只說「避免用 FOR UPDATE」;或只依賴重試,但沒說如何確保鎖順序一致。

4. 題目:跨多個資料表或服務的分散式交易如何實作?

面試官想測什麼?理想回答要點紅旗警告 (Red Flag)
關鍵:兩階段提交(2PC) 複雜度與 最終一致性 實務權衡的掌握。結論: 在微服務或跨庫場景,應採用 Saga 模式 實現最終一致性細節: 描述 Saga 流程:將單一交易拆成一系列本地事務,透過 事件/消息隊列 串聯。如果任一本地事務失敗,則觸發補償交易回滾之前已完成的步驟。架構: 利用 消息系統(如 Kafka/RabbitMQ)確保事件的可靠傳輸,保證可恢復性。只提 XA / 兩階段提交(2PC),忽略其在現代分散式系統中性能差、阻塞時間長、難以操作的現實問題。

三、 索引與查詢:優化與失效陷阱

5. 題目:為什麼加索引後某些查詢反而變慢?

面試官想測什麼?理想回答要點紅旗警告 (Red Flag)
關鍵: 索引的 I/O 成本寫入成本選擇性(Selectivity),以及 DB 統計資訊(Statistics) 的影響。結論: 索引會帶來 寫入延遲(需要同時更新索引)和查詢 I/O 成本(優化器可能選擇錯誤計畫)。細節: 1. 寫入成本: 索引越多,INSERT/UPDATE/DELETE 越慢。2. 低選擇性: 如果索引欄位重複值過多(例如性別),優化器可能放棄使用索引,導致額外的 I/O 開銷。3. 優化器誤判: 統計資訊過期或不準確,導致優化器選擇全表掃描。解法: 使用 EXPLAIN 分析掃描行數;定期更新統計資訊。只講「因為索引太多」,但不能提供具體的診斷工具EXPLAIN)或判斷依據(選擇性、寫入延遲)。

6. 題目:有哪些情況下索引不會被用到?(舉例)

面試官想測什麼?理想回答要點紅旗警告 (Red Flag)
關鍵: 考核對 SQL 語句、函式與索引之間邊界條件的細節掌握。結論: 索引失效通常是查詢條件破壞了索引的有序性或可比性舉例: 1. 模糊查詢: LIKE '%keyword'(開頭使用通配符)。2. 隱式型別轉換: WHERE phone = 123 (若 phone 是字串型別)。3. 欄位上套用函式: WHERE YEAR(date_column) = 2024。4. 複合索引順序錯誤: 查詢條件未使用複合索引的前導欄位優化: 應改寫查詢或建立覆蓋索引(Covering Index)只能列出 1-2 種情況,或沒說清楚隱式型別轉換的本質原因

四、 遷移與治理:零停機與權衡陷阱

7. 題目:要把某欄位從 INT 換成 BIGINT,且資料量有 TB,如何做零停機遷移

面試官想測什麼?理想回答要點紅旗警告 (Red Flag)
關鍵: 考核候選人對線上 DDL 工具雙寫風險控制的掌握。結論: 絕不能直接 ALTER TABLE(會鎖表),必須使用線上 Schema 變更工具細節: 採用如 pt-online-schema-changegh-ost 的工具。原理是:1. 建立新表: 建立擁有新 Schema 的影子表。2. 雙寫/追趕: 在應用層實現雙寫(寫入舊表與影子表);工具則負責回填(Backfill)舊表資料並透過 Binlog 實時同步增量數據。3. 原子切換: 最終透過原子性的 RENAME TABLE 完成切換。風險: 需全程監控複製延遲主從負載單純建議停機,或只建議使用 ALTER TABLE 而未考慮到高併發下的表鎖問題。

8. 題目:為什麼有時要反正規化?會帶來哪些後果?

面試官想測什麼?理想回答要點紅旗警告 (Red Flag)
關鍵: 考核候選人對 讀/寫性能 Trade-offs資料一致性維護成本 的理解。結論: 反正規化的目的是提升讀取性能,以犧牲寫入與一致性維護成本為代價。情境: 適用於 報表、查詢成本高的 Join讀取遠高於寫入 的情境(例如將用戶名快取到訂單表)。後果: 1. 資料冗餘: 儲存空間增大。2. 更新異常: 當原始資料更新時,所有冗餘的複本都需要同步更新,增加 寫入負擔資料不一致 的風險。策略: 必須設計自動同步機制(如事件驅動)來維護資料一致性。只單純說「讀取速度快」,但未說明如何維護冗餘資料的同步與一致性

五、 安全、合規與運維:風險與成本陷阱

9. 題目:若法律要求刪除用戶資料,你怎麼在資料庫層面落實?

面試官想測什麼?理想回答要點紅旗警告 (Red Flag)
關鍵: 硬刪除軟刪除(Soft Delete) 的權衡、備份快照的處理、以及合規性挑戰。結論: 需採用 硬刪除(Hard Delete) 才能滿足合規要求,但必須分階段進行。流程: 1. 應用層 Soft Delete: 設定 deleted_at 欄位,停止服務存取。2. 後台 Hard Delete Job: 啟動一個低優先級的任務,根據外鍵與關聯關係,徹底清除相關資料。3. 備份處理: 最關鍵的是:必須確保未來的備份長期保留的快照中不再包含該敏感資料。4. 審計: 記錄刪除請求與執行的完整日誌。只講 Soft Delete,沒提到備份快照異地複本仍可能保留敏感資料的合規風險

10. 題目:RPO 1 小時、RTO 10 分鐘,你怎麼設計?

面試官想測什麼?理想回答要點紅旗警告 (Red Flag)
關鍵:SLA 指標 轉化為 具體技術架構 的能力。結論: RTO (恢復時間) 10 分鐘要求 自動化故障切換RPO (資料丟失) 1 小時則要求備份/複製延遲小於 1 小時。架構: 1. RTO (10m): 採用 主從複製,並搭配 自動 Failover 程式(如 Orchestrator, Patroni)與健康檢查,將切換時間控制在數分鐘內。2. RPO (1h): 採用 異步複製 即可滿足(延遲遠小於 1 小時)。如果要求 RPO 趨近於零,則必須使用半同步/同步複製關鍵: 必須有定期的災難恢復演練,並記錄每次演練的 RTO 紀錄。只貼合工具名(如 RDS Multi-AZ)但沒有說明演練與驗證的重要性,或混淆了同步/異步複製的 RPO 差異。

11. 題目:為什麼雲端 DB 服務有時比自管貴,但你還會選擇自管?

面試官想測什麼?理想回答要點紅旗警告 (Red Flag)
關鍵: 檢視候選人對 成本(TCO)控制權合規 之間的商業與技術權衡。結論: 選擇自管是為了極致的控制權降低長期 TCO滿足特殊的合規要求情境: 1. 性能調校: 需要對內核參數、作業系統層進行極度深度優化(例如,針對極高 I/O 或記憶體密集型場景),雲端託管服務無法滿足。2. 資料主權/合規: 某些金融/政府客戶要求資料必須放在特定實體機房。3. 長期成本: 當業務體量極大且增長趨緩時,自管可能透過自建硬體/優化授權,長期 TCO 低於雲端。只單純回答「因為自管便宜/控制力強」,而不能給出具體的、不可替代的自管場景(例如:需要修改 DB 內核或 OS 層參數)。


沒有留言:

張貼留言

📦 LogiFlow WMS:打造 SaaS 多租戶倉儲管理系統的技術實踐

📦 LogiFlow WMS:打造 SaaS 多租戶倉儲管理系統的技術實踐 在企業數位化的浪潮下,倉儲管理系統 (WMS) 不再只是單一公司的內部工具,而是需要支援 多租戶 (Multi-Tenant) 的 SaaS 架構。這意味著系統必須在共享基礎設施的同時,保有嚴格的資...