V.Dev Blog

面試問題記錄

面試問題記錄

interview

MYSQL 索引優缺點

答: 儘管索引在MySQL中提供了許多優勢,但也存在一些缺點和限制。以下是一些MySQL索引的常見缺點: 空間需求:索引需要額外的存儲空間。對於包含大量數據的表,索引可能會佔用大量磁盤空間,導致存儲需求增加。 更新和插入操作的效率:當進行數據的更新和插入操作時,索引需要被更新以維持數據的一致性。這可能導致插入和更新操作的效率降低,尤其是對於包含多個索引的表格。 索引維護成本:隨著數據量的增加,索引的維護成本也會增加。當表格中的數據進行更改時,索引需要被更新和重構,這可能需要額外的計算和I/O操作。 過多的索引:在某些情況下,過多的索引可能導致性能下降。過多的索引會增加查詢優化器的成本,並且可能導致不必要的磁盤讀取和內存消耗。 索引選擇的困難性:選擇適合的索引是一個複雜的任務,需要考慮多個因素,如查詢模式、數據分佈和數據量等。不當的索引選擇可能導致性能下降,甚至引起死鎖和衝突等問題。 索引的限制:MySQL索引有一些限制,例如對於大文本字段的索引長度有限制,或者對於某些數據類型(如BLOB和TEXT)不支持索引。 在使用索引時,需要仔細考慮表格結構、查詢模式和性能需求等因素,並根據具體情況進行優化和調整。正確使用和設計索引可以大大提升查詢性能,但也需要注意索引的缺點和限制。

优点: 查询起来就是快,因为MySQL的索引底层用的是B+树存储的,这种存储方式查询起来就是快. 具体为什么底层采用B+树进行存储请参考我的另一篇文章 https://www.jianshu.com/p/99aabf9611a3 通过唯一索引,可以保障数据库表中每一行数据的唯一性 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间

缺点: 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大。 对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件,而且它还要把这些改动写入索引文件。所以为每一列都创建索引非常不明智

作者:BABA_777 链接:https://www.jianshu.com/p/01c4f7e1d429 来源:简书

hyperf task 的機至原理?

Hyperf 是一個基於 PHP 的高性能框架,它提供了 Task 功能,用於執行非同步的任務。

在 Hyperf 中,Task 的執行遵循以下的原理:

使用者提交一個 Task 到 Task Worker 進程。 Task Worker 進程接收到 Task 後,將其放入 Task 隊列中。 Task Worker 隨後從 Task 隊列中取出 Task,並且以非同步的方式執行該任務。 Task 的執行結果被記錄下來,並且可以被取回。 這種非同步執行 Task 的機制讓 Hyperf 可以處理高併發的任務,提升系統的處理能力和效能。

需要注意的是,Task 是在 Hyperf 的 Task Worker 進程中執行的,而非在 Web 進程中。這樣可以確保 Task 的執行不會阻塞 Web 進程,提高整體系統的穩定性和效能。

值得一提的是,Task 功能在某些場景下非常有用,例如處理需要時間較長的任務、發送郵件、發送短信等。通過將這些耗時的操作放入 Task 中,可以讓 Web 請求迅速返回,同時保證這些任務能夠被背景執行,提高系統的效率和性能。

mysql 不重覆查詢要怎麼下?

在MySQL中,要達到不重覆查詢的效果,可以使用DISTINCT關鍵字或者GROUP BY子句。 需要注意的是,使用DISTINCT或GROUP BY可能會對查詢性能產生一定影響,特別是在處理大量數據時。

DISTINCT或GROUP BY 這二個有什麼差異

DISTINCT和GROUP BY兩者都可以用於實現不重覆查詢,但它們之間有一些差異: DISTINCT: DISTINCT是一個關鍵字,直接在SELECT語句中使用。 DISTINCT用於去除結果集中的重複行,只返回唯一的行。 DISTINCT會對所有選取的列進行去重,即使它們在組合時不重複。

GROUP BY: GROUP BY是一個子句,在SELECT語句中使用。 GROUP BY根據指定的列將結果集分組,並將相同分組的行合併成一行。 GROUP BY需要搭配聚合函數(如SUM、COUNT等)一起使用,以便對每個分組進行計算或統計。 GROUP BY可以指定多個列,形成多層分組。 差異和使用場景:

DISTINCT可以應用於任何查詢,無論是否使用聚合函數,它主要用於去除結果集中的重複行,簡單且直觀。 GROUP BY主要用於對結果集進行分組計算,需要配合聚合函數使用,適用於進行統計和分析操作。 如果僅僅是想去除結果集中的重複行,可以使用DISTINCT;如果需要進行聚合計算或統計分析,可以使用GROUP BY。選擇使用哪個取決於具體的查詢需求和數據庫結構。

在性能方面,通常情況下使用DISTINCT比使用GROUP BY效率更高。這是因為DISTINCT只需要對結果集進行去重操作,而不需要對結果集進行分組和聚合計算。因此,在不需要聚合計算的情況下,使用DISTINCT可以更快地獲取唯一的行。

相比之下,GROUP BY需要對結果集進行分組操作,並且需要對每個分組進行聚合計算。這涉及到更多的計算和處理,可能會導致性能的下降。當需要進行聚合計算或統計分析時,使用GROUP BY是必要的,但如果只是單純地需要去除重複行,則使用DISTINCT通常更有效率。

然而,性能的評估還受到數據庫結構、索引的使用、數據量等因素的影響。對於特定的查詢需求和數據庫環境,最好進行實際測試和性能優化,以確定最佳的操作方法。

##如果你是面試官你會問什麼MYSQL 的問題 作為面試官,我可能會問以下一些問題關於MySQL:

1.你能解釋什麼是索引?為什麼在數據庫中使用索引很重要? 2.談談MySQL中的主鍵和外鍵的概念以及它們之間的區別。 3.什麼是SQL注入?如何預防SQL注入攻擊? 4.如何優化MySQL的性能?提供一些常見的性能優化技巧。 5.什麼是事務(Transaction)?談談事務的ACID特性。 6.如何進行MySQL數據庫的備份和恢復? 7.談談MySQL中的鎖(Locks)和事務隔離級別(Isolation Levels)。 8.什麼是視圖(View)?在什麼情況下會使用視圖? 9.如何執行MySQL的性能監控和故障排除? 10.MySQL中的儲存過程(Stored Procedures)和觸發器(Triggers)有什麼作用?

這些問題可以幫助我評估面試者對MySQL的基礎知識和經驗的了解程度,以及他們在數據庫設計、性能優化、安全性和故障排除方面的能力。同時,我也會根據面試者的回答進一步深入討論相關的主題和概念。

1.索引是一種數據結構,用於提高數據庫的查詢效率。它能夠快速定位到具有特定值的數據行,避免全表掃描,從而提高查詢速度。

2.主鍵(Primary Key)是一個唯一識別數據庫表中每一行的字段,用於確保表中的每一行都有唯一的識別。外鍵(Foreign Key)是用於建立兩個表之間的關聯的字段,它引用了另一個表中的主鍵。 3.SQL注入是一種安全漏洞,通過將惡意的SQL代碼插入到應用程序的SQL查詢中,從而獲得非授權的數據訪問。要預防SQL注入攻擊,可以使用參數化查詢或預處理語句,以確保用戶輸入的數據不會被誤解為SQL代碼。 4.MySQL性能優化的技巧包括使用適當的索引、適當設計數據庫結構、使用緩存、進行查詢優化、調整數據庫參數等。 5.事務是一組操作的集合,它們被視為一個單獨的執行單元,要麼全部執行成功,要麼全部回滾失敗。ACID是事務的四個特性,分別是原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。 6.MySQL數據庫的備份和恢復可以通過物理備份和邏輯備份來實現。物理備份是指將整個數據庫文件系統複製到備份位置,邏輯備份是指導出SQL語句,將數據導出到備份文件中。 7.鎖(Locks)用於確保數據庫操作的一致性和完整性,而事務隔離級別(Isolation Levels)用於控制並發操作時數據的可見性和一致性。 8.視圖(View)是虛擬的表,由一個或多個基礎表的查詢結果組成。視圖可以簡化複雜的查詢操作,提供更高的安全性,以及簡化應用程序和報表的開發。 9.MySQL的性能監控可以通過使用性能監控工具(如Explain、Slow Query Log、Performance Schema等)來追蹤和分析查詢的執行計劃、查詢性能等,並根據結果進行優化和調整。 10.儲存過程(Stored Procedures)和觸發器(Triggers)是在數據庫中保存的可執行的程序代碼。儲存過程用於執行一系列的SQL語句,觸發器則是在特定的數據操作(如插入、更新、刪除)觸發時自動執行相應的操作。它們可以提高數據庫的可重用性和安全性。