架構面試-數據庫優化問題

文章目錄

  • 如何定位慢查詢
      • 1. 開啟慢查詢日志
        • MySQL示例:
        • PostgreSQL示例:
      • 2. 分析慢查詢日志
        • MySQL:
        • PostgreSQL:
      • 3. 使用數據庫性能工具
        • MySQL:
        • PostgreSQL:
      • 4. 優化慢查詢
      • 5. 監控與持續優化
  • sql語句執行的很慢,如何分析
      • 1. 查看執行計劃(EXPLAIN)
        • MySQL 示例:
        • PostgreSQL 示例:
      • 2. 檢查索引
      • 3. 分析表統計信息
        • MySQL 示例:
        • PostgreSQL 示例:
      • 4. 檢查查詢語法
      • 5. 使用慢查詢日志
      • 6. 分析數據庫性能
      • 7. 使用數據庫監控工具
      • 8. 查詢優化
      • 9. 系統級優化
      • 10. 持續監控與調優
  • 索引概念及索引底層數據結構
      • 索引的概念
      • 索引的作用
      • 索引的底層數據結構
      • 索引的選擇與使用
  • 聚簇索引和非聚簇索引、回表查詢
      • 聚簇索引(Clustered Index)與非聚簇索引(Non-Clustered Index)
        • 聚簇索引(Clustered Index)
        • 非聚簇索引(Non-Clustered Index)
      • 回表查詢(Index Lookup)
      • 總結
  • 覆蓋索引、超大分頁優化
      • 覆蓋索引(Covering Index)
        • 如何創建覆蓋索引
      • 超大分頁優化
        • 優化方法:基于主鍵或排序字段的分頁
        • 優化方法:使用覆蓋索引
        • 優化方法:預加載
      • 總結
  • 索引創建的原則
  • 什么情況下索引會失效
  • 談一談你對sql優化的經驗

如何定位慢查詢

定位慢查詢是數據庫優化的關鍵步驟,尤其是對于關系型數據庫如MySQL、PostgreSQL等。以下是定位和優化慢查詢的一般步驟:

1. 開啟慢查詢日志

大多數關系型數據庫都支持慢查詢日志功能,這可以幫助記錄執行時間超過設定閾值的SQL語句。首先,你需要確保慢查詢日志已經被開啟。

MySQL示例:
  • my.cnfmy.ini配置文件中添加或修改以下行:

    [mysqld]
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/slow.log
    long_query_time = 2
    

    其中long_query_time定義了慢查詢的閾值(秒),即執行時間超過2秒的查詢會被記錄到日志中。

PostgreSQL示例:
  • postgresql.conf配置文件中添加或修改以下行:
    log_min_duration_statement = 2000  # 單位為毫秒,記錄執行時間超過2秒的查詢
    logging_collector = on
    log_directory = 'pg_log'
    

2. 分析慢查詢日志

一旦慢查詢日志被開啟并記錄了一段時間,你就可以開始分析日志文件,找出具體的慢查詢語句。

MySQL:
  • 使用mysqldumpslow工具來分析慢查詢日志,例如:
    mysqldumpslow --input-log=/var/log/mysql/slow.log
    
PostgreSQL:
  • 可以直接閱讀日志文件,或者使用第三方工具如pgBadger來解析和分析日志。

3. 使用數據庫性能工具

除了日志分析,還可以利用數據庫自帶的性能監控工具。

MySQL:
  • SHOW PROCESSLIST;SHOW FULL PROCESSLIST; 命令可以查看當前正在運行的查詢。
  • EXPLAIN SQL語句可以分析查詢計劃,幫助理解查詢的執行效率。
PostgreSQL:
  • pg_stat_activity 視圖提供了關于當前活動會話的信息。
  • EXPLAIN (ANALYZE, BUFFERS) 可以查看查詢的實際執行情況和緩存使用。

4. 優化慢查詢

基于上述分析,你可以采取以下措施優化慢查詢:

  • 索引優化:為經常用于查詢條件的列創建索引,確保索引選擇性和唯一性。
  • 查詢優化:避免全表掃描,減少JOIN操作,使用更有效的連接類型,如INNER JOIN代替LEFT JOIN當可能時。
  • 分頁優化:如果查詢涉及大量數據的分頁,考慮使用LIMIT OFFSET的替代方案,如基于ID的分頁。
  • 硬件升級:增加內存、使用更快的硬盤或SSD,或者增加計算資源。
  • 數據庫架構調整:考慮數據庫分區、讀寫分離等高級策略。

5. 監控與持續優化

優化后,繼續監控數據庫性能和慢查詢日志,確保優化效果,并及時發現新的性能瓶頸。

通過以上步驟,你可以有效地定位和解決數據庫中的慢查詢問題,從而提升整體系統性能。

sql語句執行的很慢,如何分析

當遇到SQL語句執行緩慢的問題時,可以采用以下步驟進行詳細的分析和診斷:

1. 查看執行計劃(EXPLAIN)

使用EXPLAIN關鍵字來分析SQL語句的執行計劃。這將顯示數據庫如何執行查詢,包括表的掃描方式、索引的使用情況、連接類型等信息。

MySQL 示例:
EXPLAIN SELECT * FROM table_name WHERE condition;
PostgreSQL 示例:
EXPLAIN (ANALYZE, BUFFERS) SELECT * FROM table_name WHERE condition;

2. 檢查索引

檢查是否使用了合適的索引,以及索引是否被有效地利用。如果查詢涉及復雜的JOIN操作或WHERE子句,可能需要添加復合索引或重新考慮索引設計。

3. 分析表統計信息

運行ANALYZE命令更新表統計信息,確保數據庫優化器有最新的數據分布信息。

MySQL 示例:
ANALYZE TABLE table_name;
PostgreSQL 示例:
VACUUM ANALYZE table_name;

4. 檢查查詢語法

  • 確保SELECT語句只選擇了真正需要的列,避免使用SELECT *
  • 確保WHERE子句中的條件盡可能具體,避免全表掃描。
  • 檢查是否存在不必要的子查詢或嵌套查詢。

5. 使用慢查詢日志

啟用并檢查慢查詢日志,找到執行時間過長的查詢。這有助于識別模式并確定優化的重點。

6. 分析數據庫性能

  • 檢查數據庫的CPU和I/O使用情況,確定瓶頸。
  • 監控數據庫的緩沖池和緩存使用情況,確保足夠的內存用于緩存數據和索引。

7. 使用數據庫監控工具

許多數據庫管理系統提供了內置的監控工具,如pg_stat_activity(PostgreSQL)、SHOW PROCESSLIST(MySQL)等,可以查看當前正在運行的查詢及其狀態。

8. 查詢優化

根據上述分析的結果,優化查詢,可能包括:

  • 重構查詢邏輯。
  • 添加或修改索引。
  • 分區大表。
  • 調整數據庫配置參數,如緩存大小、連接數等。

9. 系統級優化

  • 升級硬件,如增加內存、使用SSD等。
  • 調整操作系統級別的設置,如文件系統緩存、I/O調度器等。

10. 持續監控與調優

優化后,持續監控查詢性能,確保改進的效果,并隨時準備調整以適應系統的變化。

通過這些步驟,可以系統地分析和解決SQL語句執行緩慢的問題,提高數據庫的性能和響應速度。

索引概念及索引底層數據結構

索引的概念

索引是數據庫中的一種數據結構,它類似于圖書的目錄,用于快速定位數據。沒有索引的情況下,數據庫必須從第一條記錄開始逐條查找,直到找到所有滿足條件的記錄為止,這種搜索方式稱為全表掃描,效率低下。索引可以極大地提高數據檢索的速度,尤其是在處理大數據量和復雜查詢時。

索引的作用

  1. 加速數據檢索:索引可以減少數據庫的I/O操作次數,從而加快查詢速度。
  2. 輔助排序和分組:在執行ORDER BY和GROUP BY操作時,索引可以避免全表掃描,提高排序和分組的效率。
  3. 唯一性約束:某些類型的索引(如唯一索引)可以保證數據的唯一性,防止插入重復的記錄。

索引的底層數據結構

數據庫中常用的索引數據結構主要有以下幾種:

  1. B樹(B-Tree)

    • B樹是一種自平衡的樹結構,非常適合磁盤等存儲設備,因為它可以減少磁盤的I/O次數。B樹的每一個節點可以有多個子節點,且節點內存儲的數據量較大,這使得B樹的高度相對較小,從而減少了查詢時的磁盤訪問次數。
    • MySQL的InnoDB存儲引擎使用B樹作為索引結構。
  2. B+樹(B-Plus Tree)

    • B+樹是B樹的一種變體,它的所有數據都存儲在葉子節點上,非葉子節點只用于索引。這種結構使得B+樹在進行范圍查詢時更為高效,因為所有數據都在同一層,可以順序訪問。
    • B+樹也是MySQL InnoDB存儲引擎的主要索引結構。
  3. 哈希索引(Hash Index)

    • 哈希索引使用哈希函數將鍵映射到特定的位置,以實現快速查找。哈希索引最適合等值查詢,但在處理范圍查詢和排序時效率不高,因為哈希表不具備順序性。
    • MySQL的MEMORY存儲引擎支持哈希索引。
  4. 位圖索引(Bitmap Index)

    • 位圖索引主要用于低基數的列(即列中不同值的數量很少),它可以非常高效地存儲和查詢數據,但隨著列基數的增加,位圖索引的效率會迅速下降。
  5. R樹(R-Tree)

    • R樹是多維數據的索引結構,常用于地理信息系統(GIS)中處理空間數據的查詢。

索引的選擇與使用

不同的數據庫系統可能支持不同的索引類型,選擇哪種索引取決于數據的特點和查詢的需求。例如,對于頻繁進行范圍查詢的列,B+樹是一個好的選擇;而對于需要快速查找固定值的列,哈希索引可能更合適。在設計數據庫時,合理地使用索引可以顯著提高查詢性能,但過多或不恰當的索引也會增加寫操作的成本,因此需要權衡利弊。

聚簇索引和非聚簇索引、回表查詢

聚簇索引(Clustered Index)與非聚簇索引(Non-Clustered Index)

在數據庫中,索引的類型可以大致分為聚簇索引和非聚簇索引。這兩者的根本區別在于數據的物理存儲方式和索引的結構。

聚簇索引(Clustered Index)
  • 定義:聚簇索引決定了表中數據的物理存儲順序。換句話說,數據行在磁盤上的排列順序就是聚簇索引的順序。一個表只能有一個聚簇索引,因為數據本身只能有一種物理存儲順序。
  • 數據存儲:在聚簇索引中,索引的葉節點包含了完整的數據行。例如,InnoDB存儲引擎中,表數據是以聚簇索引的方式存儲的,默認使用主鍵作為聚簇索引。
  • 查詢效率:對于基于聚簇索引的查詢,可以直接定位到數據行,而不需要額外的查找,因此查詢效率較高。
非聚簇索引(Non-Clustered Index)
  • 定義:非聚簇索引的結構與聚簇索引不同,它并不決定數據的物理存儲順序。非聚簇索引的葉節點存儲的是指向數據行的指針,而不是數據行本身。
  • 數據存儲:非聚簇索引的葉節點包含索引鍵值和指向數據行的指針。由于數據行本身并不存儲在非聚簇索引中,所以一個表可以有多個非聚簇索引。
  • 查詢效率:使用非聚簇索引查詢時,如果索引中不包含查詢所需的所有列,就需要通過索引中的指針去訪問實際的數據行,這個過程稱為回表查詢(Index Lookup),會增加額外的I/O操作,降低查詢效率。

回表查詢(Index Lookup)

  • 定義:回表查詢是指在使用非聚簇索引進行查詢時,索引中不包含查詢所需的所有列信息,因此需要根據索引中的指針回到數據行中獲取額外的信息。這個過程會增加額外的磁盤I/O操作,從而影響查詢性能。
  • 避免回表查詢:為了減少回表查詢,可以考慮在非聚簇索引中包含更多的列(也稱為覆蓋索引或索引包含),只要這些列能夠滿足大部分查詢需求。這樣,查詢時可以直接從索引中獲取所有需要的數據,而無需回表。

總結

聚簇索引和非聚簇索引的選擇和使用取決于具體的應用場景和查詢需求。聚簇索引提供了更好的查詢性能,但限制了數據的物理存儲順序;非聚簇索引提供了更大的靈活性,但可能引入回表查詢。在設計數據庫索引時,需要根據數據特性和查詢模式來合理選擇和優化索引結構。

覆蓋索引、超大分頁優化

覆蓋索引(Covering Index)

覆蓋索引是指索引中包含了查詢所需要的所有列,因此在查詢時,數據庫不需要再回到表的數據行中去獲取額外的信息,從而避免了回表查詢(Index Lookup)。這可以顯著減少磁盤I/O操作,提高查詢效率,尤其是在查詢涉及的列較少,但數據量很大的情況下。

如何創建覆蓋索引

假設有一個名為orders的表,其結構如下:

CREATE TABLE orders (id INT PRIMARY KEY,customer_id INT,order_date DATE,product VARCHAR(100),price DECIMAL(10, 2)
);

如果經常執行如下查詢:

SELECT customer_id, order_date, product FROM orders WHERE customer_id = 123;

則可以創建一個覆蓋索引:

CREATE INDEX idx_orders ON orders(customer_id, order_date, product);

這樣,對于上述查詢,數據庫可以直接從索引中獲取customer_idorder_dateproduct,而無需訪問實際的數據行。

超大分頁優化

在處理超大分頁查詢時,傳統的OFFSET N LIMIT M方法會變得非常低效,因為它需要先跳過N條記錄,然后再獲取M條記錄。對于大數據量的表,這會導致大量的數據讀取和排序操作,消耗大量的CPU和I/O資源。

優化方法:基于主鍵或排序字段的分頁

一種更高效的分頁策略是基于主鍵或其他排序字段進行分頁,而不是使用OFFSET。例如,假設我們有一個博客文章表posts,按照id排序,我們可以使用如下查詢:

SELECT * FROM posts WHERE id < 1000 ORDER BY id DESC LIMIT 10;

這將返回id小于1000的最后10篇文章。在下一頁中,我們可以使用上一頁的最大id作為起始點,例如:

SELECT * FROM posts WHERE id < 990 ORDER BY id DESC LIMIT 10;

其中990是上一頁中最小的id值。

優化方法:使用覆蓋索引

如果分頁查詢只需要部分列,可以創建一個包含這些列的覆蓋索引,以減少查詢的I/O操作。

優化方法:預加載

對于固定數量的分頁查詢,可以預先加載一定范圍內的數據,然后在客戶端進行分頁,避免每次分頁請求都要進行數據庫查詢。

總結

覆蓋索引和超大分頁優化都是提高數據庫查詢效率的重要手段。覆蓋索引通過減少回表查詢,降低了I/O開銷;而超大分頁優化通過改變分頁策略,避免了大量數據的無謂讀取和排序,兩者都可以顯著提升數據庫的性能表現。在設計數據庫查詢和優化時,應根據具體的應用場景和查詢需求,靈活運用這些優化技巧。

索引創建的原則

創建索引是數據庫優化的重要組成部分,合理的索引設計可以顯著提升查詢性能。但是,索引并不是越多越好,過多的索引會增加寫入操作的開銷,占用更多存儲空間。以下是創建索引時應遵循的一些基本原則:

  1. 最頻繁查詢的列

    • 對于查詢中經常用作篩選條件的列,創建索引可以顯著提高查詢速度。
    • 特別是那些出現在WHERE子句中的列,以及用于JOIN操作的列。
  2. 高選擇性列

    • 選擇性高的列,即具有較少重復值的列,更適合創建索引。這可以確保索引的有效性,避免過多的I/O操作。
    • 主鍵通常具有最高選擇性,因此是創建索引的首選。
  3. 覆蓋索引

    • 創建包含查詢中所有列的索引,可以避免回表查詢,減少I/O操作。
    • 但要注意,覆蓋索引不應包含太多列,否則會增加索引的維護成本。
  4. 避免對低基數列創建索引

    • 低基數列,即重復值很多的列,創建索引的效果不佳,甚至可能導致查詢性能下降。
  5. 考慮索引的維護成本

    • 插入、更新和刪除操作需要維護索引,因此,對于寫操作頻繁的列,應謹慎創建索引。
    • 對于大量寫操作的表,可以考慮使用延遲索引更新或批量更新策略。
  6. 多列索引的順序

    • 多列索引中列的順序很重要,應根據查詢模式來確定。最常用于篩選的列應放在前面。
    • 例如,如果查詢經常使用WHERE country = 'US' AND city = 'New York',則應創建(country, city)的索引,而不是(city, country)
  7. 使用最短有效的列

    • 如果列的值很長,可以考慮創建前綴索引,僅索引列值的一部分,但這可能會影響索引的選擇性。
  8. 定期分析和維護索引

    • 使用ANALYZE TABLE等命令定期更新統計信息,確保數據庫優化器可以做出正確的決策。
    • 定期檢查和調整索引,移除不再使用的索引,避免冗余索引。
  9. 考慮數據庫特性

    • 不同的數據庫系統可能有不同的索引實現和優化策略,創建索引時應參考具體數據庫的文檔和最佳實踐。
  10. 測試和監控

    • 創建索引后,應通過測試和監控來評估其性能影響,確保索引達到了預期的優化效果。

記住,索引設計是一個平衡的過程,需要在查詢性能、寫入性能、存儲空間和維護成本之間找到最優解。在實際應用中,應根據具體的工作負載和業務需求,靈活調整索引策略。

什么情況下索引會失效

索引在數據庫查詢優化中扮演著至關重要的角色,但在某些情況下,數據庫優化器可能不會使用索引,導致索引失效。以下是一些常見的索引失效情形:

  1. 使用不等于操作符

    • 當查詢條件使用!=<>操作符時,數據庫很難利用索引來排除不匹配的行,因此索引可能不會被使用。
  2. 使用通配符搜索

    • 當LIKE語句的通配符%位于搜索模式的開頭時,如LIKE '%search_text%',數據庫無法有效地利用索引,因為索引是按順序存儲的,這樣的查詢可能需要全表掃描。
    • 但如果通配符位于搜索模式的末尾,如LIKE 'search_text%',索引仍然可以被利用。
  3. 在索引列上使用函數

    • 如果查詢條件中包含對索引列使用函數,如WHERE UPPER(column_name) = 'VALUE',數據庫將無法直接使用索引,因為索引存儲的是列的原始值,而不是函數處理后的值。
  4. 使用OR操作符連接非等價條件

    • OR操作符連接的條件中至少有一個不能使用索引時,整個查詢可能都不會使用索引。例如,WHERE col1 = value1 OR col2 LIKE '%value2%',其中col2 LIKE '%value2%'導致索引失效,可能影響整個查詢的性能。
  5. 查詢條件中使用變量

    • 如果查詢條件中的值是通過變量傳遞的,如WHERE column_name = ?,在某些情況下,數據庫優化器可能無法有效利用索引。這是因為優化器需要知道具體的值來決定是否使用索引。
  6. 顯式禁用索引

    • 在某些數據庫中,可以顯式地禁用索引,如FORCE INDEX (idx_name)IGNORE INDEX (idx_name),這通常用于調試或強制使用特定的查詢計劃。
  7. 索引選擇性差

    • 如果索引的選擇性較差,即索引列的值分布不均,數據庫優化器可能認為全表掃描比使用索引更有效率。
  8. 索引列數據類型不匹配

    • 如果查詢條件和索引列的數據類型不一致,如使用字符串與數值比較,索引可能不會被使用。
  9. 統計信息過時

    • 如果表的統計信息沒有及時更新,數據庫優化器可能無法準確估計使用索引的成本,從而導致索引失效。

為了避免索引失效,應盡量避免上述情況的發生,并定期分析和優化索引策略,確保索引能夠有效地支持查詢需求。在設計查詢和創建索引時,應充分考慮數據庫優化器的行為和索引的使用條件。

談一談你對sql優化的經驗

SQL優化是數據庫管理和應用開發中不可或缺的一部分,旨在提高查詢效率,減少資源消耗,提升系統整體性能。以下是我對SQL優化的一些經驗和建議:

  1. 理解查詢計劃

    • 使用EXPLAIN語句來查看查詢的執行計劃,理解數據庫如何執行查詢,識別性能瓶頸。
    • 關注EXPLAIN輸出中的possible_keyskeyrowsExtra等列,它們可以幫助你了解索引使用情況和預計掃描行數。
  2. 合理使用索引

    • 為頻繁用于WHERE子句和JOIN操作的列創建索引。
    • 創建多列索引時,根據查詢模式確定列的順序。
    • 使用覆蓋索引來避免回表查詢,提高查詢效率。
  3. 優化查詢語句

    • 減少使用SELECT *,只選擇需要的列,以減少數據傳輸量。
    • 避免在索引列上使用函數,除非函數被索引覆蓋。
    • 使用EXISTSIN子句替換JOIN,根據具體情況選擇更優的寫法。
    • 優化GROUP BYDISTINCT,避免在大數據量上使用,考慮使用物化視圖或匯總表。
  4. 避免全表掃描

    • 盡量使用限制條件來減少掃描范圍,如WHERE子句。
    • 使用分區表來分割大數據集,減少單個查詢的掃描范圍。
  5. 數據類型和存儲

    • 選擇適當的數據類型,避免數據類型過大導致的存儲浪費和性能損耗。
    • 考慮使用壓縮和歸檔策略來管理歷史數據。
  6. 并發和鎖定

    • 優化事務處理,減少鎖的等待時間,使用樂觀鎖或悲觀鎖策略根據場景選擇。
    • 減少長時間運行的查詢,避免阻塞其他事務。
  7. 統計信息和維護

    • 定期更新統計信息,確保數據庫優化器能夠做出準確的決策。
    • 執行定期的索引維護,如重建和重組,保持索引健康。
  8. 使用物化視圖和匯總表

    • 對于頻繁的復雜查詢,可以創建物化視圖或匯總表,提前計算結果,減少實時計算的開銷。
  9. 數據庫配置和硬件

    • 調整數據庫配置參數,如緩存大小、并發連接數等,以適應應用需求。
    • 升級硬件,如增加內存、使用更快的存儲設備,可以顯著提升性能。
  10. 持續監控和調優

    • 使用數據庫的監控工具,如慢查詢日志、性能監視器等,持續監控數據庫性能。
    • 根據監控數據,定期調整和優化SQL查詢和索引策略。

SQL優化是一個持續的過程,需要結合應用的具體需求和數據庫的特性,不斷調整和優化。在實踐中,應注重理論與實踐相結合,通過測試和實驗來驗證優化效果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42455.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42455.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42455.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從0到1制作單只鰲蝦運動軌跡追蹤軟件

前言 需要準備windows10操作系統&#xff0c;python3.11.9&#xff0c;cuDNN8.9.2.26&#xff0c;CUDA11.8&#xff0c;paddleDetection2.7 流程&#xff1a; 準備數據集-澳洲鰲蝦VOC數據集 基于RT-DETR目標檢測模型訓練導出onnx模型進行python部署平滑濾波處理視頻幀保留的…

簡介時間復雜度

好了&#xff0c;今天我們來了解一下&#xff0c;我們在做練習題中常出現的一個名詞。時間復雜度。我相信大家如果有在練習過題目的話。對這個名詞應該都不陌生吧。但是可能很少的去思考它是干什么的代表的什么意思。反正我以前練習的時候就是這樣。我只知道有這么一個名詞在題…

【全面講解下iPhone新機官網驗機流程】

&#x1f3a5;博主&#xff1a;程序員不想YY啊 &#x1f4ab;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f917;點贊&#x1f388;收藏?再看&#x1f4ab;養成習慣 ?希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出…

MybatisPlus實現插入/修改數據自動設置時間

引言 插入數據時自動設置當前時間&#xff0c;更新數據時自動修改日期為修改時的日期。 使用MybatisPlus的擴展接口MetaObjectHandler 步驟 實現接口 實體類加注解 實現接口 package com.example.vueelementson.common;import com.baomidou.mybatisplus.core.handlers.M…

C++ 模版進階

目錄 前言 1. 非類型模版參數 1.1 概念與講解 1.2 array容器 2. 模版的特化 2.1 概念 2.2 函數模版特化 2.3 類模版特化 2.3.1 全特化 2.3.2 偏特化 3.模版的編譯分離 3.1 什么是分離編譯 3.2 模版的分離編譯 3.3 解決方法 4. 模版總結 總結 前言 本篇文章主要…

包/final/權限修飾符/代碼塊

包package 1、包的作用 包用來管理不同的類。 2、包名 包名要全部小寫&#xff0c;一般是域名反寫&#xff0c;如com.liu。在Java中&#xff0c;java解釋器會將package中的.解釋為目錄分隔符/&#xff0c;也就是說該文件的目錄結構為&#xff1a;...com/liu/... 3、全類名…

1.pwn的匯編基礎(提及第一個溢出:整數溢出)

匯編掌握程度 能看懂就行&#xff0c;絕大多數情況不需要真正的編程(shellcode題除外) 其實有時候也不需要讀匯編&#xff0c;ida F5 通常都是分析gadget&#xff0c;知道怎么用&#xff0c; 調試程序也不需要分析每一條匯編指令&#xff0c;單步執行然后查看寄存器狀態即可 但…

Text2SQL提問中包括時間的實戰方案

大家好,我是herosunly。985院校碩士畢業,現擔任算法研究員一職,熱衷于機器學習算法研究與應用。曾獲得阿里云天池比賽第一名,CCF比賽第二名,科大訊飛比賽第三名。擁有多項發明專利。對機器學習和深度學習擁有自己獨到的見解。曾經輔導過若干個非計算機專業的學生進入到算法…

實現多數相加,但是傳的參不固定

一、情景 一般實現的加法和減法等簡單的相加減函數的話。一般都是寫好固定傳的參數。比如&#xff1a; function add(a,b) {return a b;} 這是固定的傳入倆個&#xff0c;如果是三個呢&#xff0c;有人說當然好辦&#xff01; 這樣寫不就行了&#xff01; function add(a…

vue中自定義設置多語言(包括使用vue-i18n),并且運行js腳本自動生成多語言文件

在項目中需要進行多個國家語言的切換時&#xff0c;可以用到下面方法其中一個 一、自定義設置多語言 方法一: 可以自己編寫一個設置多語言文件 在項目新建js文件&#xff0c;命名為&#xff1a;language.js&#xff0c;代碼如下 // language.js 文檔 let languagePage {CN…

聊一下Maven打包的問題(jar要發布)

文章目錄 一、問題和現象二、解決方法&#xff08;1&#xff09;方法一、maven-jar-pluginmaven-dependency-plugin&#xff08;2&#xff09;方法二、maven-assembly-plugin 一、問題和現象 現在的開發一直都是用spring boot&#xff0c;突然有一天&#xff0c;要自己開發一個…

Django之項目開發(二)

目錄 一、安裝和使用uWSGI 1.1、安裝 1.2、配置文件 1.3、啟動與停止uwsgi 二、安裝nginx 三、Nginx 配置uWSGI 四、Nginx配置靜態文件 五、Nginx配置負載均衡 一、安裝和使用uWSGI uWSGI 是一個 Web 服務器,可以用來部署 Python Web 應用。它是一個高性能的通用的 We…

味蕾與理解:應對自閉癥兒童挑食的策略與理解

在星貝育園自閉癥康復學校&#xff0c;我們深知飲食習慣對孩子們的成長至關重要&#xff0c;而自閉癥兒童的挑食問題往往比同齡兒童更為突出&#xff0c;給家長和照顧者帶來了額外的挑戰。今天&#xff0c;作為這里的老師&#xff0c;我想與大家分享一些應對自閉癥兒童挑食的策…

(南京觀海微電子)——電阻應用及選取

什么是電阻&#xff1f; 電阻是描述導體導電性能的物理量&#xff0c;用R表示。 電阻由導體兩端的電壓U與通過導體的電流I的比值來定義&#xff0c;即&#xff1a; 所以&#xff0c;當導體兩端的電壓一定時&#xff0c;電阻愈大&#xff0c;通過的電流就愈小&#xff1b;反之&…

鴻蒙應用實踐:利用扣子API開發起床文案生成器

前言 扣子是一個新一代 AI 應用開發平臺&#xff0c;無需編程基礎即可快速搭建基于大模型的 Bot&#xff0c;并發布到各個渠道。平臺優勢包括無限拓展的能力集&#xff08;內置和自定義插件&#xff09;、豐富的數據源&#xff08;支持多種數據格式和上傳方式&#xff09;、持…

[Unity入門01] Unity基本操作

參考的傅老師的教程學了一下Unity的基礎操作&#xff1a; [傅老師/Unity教學] Unity3D基礎入門 [華梵大學] 遊戲引擎應用基礎(Unity版本) Class#01 移動&#xff1a;鼠標中鍵旋轉&#xff1a;鼠標右鍵放大&#xff1a;鼠標滾輪飛行模式&#xff1a;右鍵WASDQEFocus模式&…

算法設計與分析 實驗5 并查集法求圖論橋問題

目錄 一、實驗目的 二、問題描述 三、實驗要求 四、實驗內容 &#xff08;一&#xff09;基準算法 &#xff08;二&#xff09;高效算法 五、實驗結論 一、實驗目的 1. 掌握圖的連通性。 2. 掌握并查集的基本原理和應用。 二、問題描述 在圖論中&#xff0c;一條邊被稱…

基于Android Studio訂餐管理項目

目錄 項目介紹 圖片展示 運行環境 獲取方式 項目介紹 能夠實現登錄&#xff0c;注冊、首頁、訂餐、購物車&#xff0c;我的。 用戶注冊后&#xff0c;登陸客戶端即可完成訂餐、瀏覽菜譜等功能&#xff0c;點餐&#xff0c;加入購物車&#xff0c;結算&#xff0c;以及刪減…

【學習筆記】操作系統--萬字長文

計算機操作系統 文章目錄 計算機操作系統引言 操作系統基本概念第一章 引論目標和作用操作系統發展歷程單道批處理系統多道批處理系統分時系統實時系統 基本特征并發共享虛擬異步性&#xff08;不確定性&#xff09; 操作系統主要功能處理機管理內存管理設備管理文件管理 第二章…

python `queue` 模塊提供了同步的、線程安全的隊列類

在Python中&#xff0c;queue 模塊提供了同步的、線程安全的隊列類&#xff0c;這使得在多線程環境下共享數據變得簡單。下面是一個使用 queue.Queue 的并發編程示例&#xff0c;其中使用了 threading 模塊來創建多個線程&#xff0c;這些線程將向隊列中添加元素并從隊列中取出…