MySql面試總結(二)

WHERE 子句優化

截至2024年7月,MySQL最新穩定版本是8.2,并不存在MySQL 8.4 。下面從常見的幾個方面為你介紹 MySQL 8.x 中 WHERE 子句的優化方法:

1. 確保使用索引

  • 原理:索引可以加快數據的查找速度,當 WHERE 子句中的條件列有索引時,MySQL 可以直接定位到符合條件的數據,而不需要全表掃描。
  • 示例
-- 創建一個表
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50),age INT,email VARCHAR(100)
);-- 為 age 列創建索引
CREATE INDEX idx_age ON users (age);-- 查詢 age 大于 20 的用戶
SELECT * FROM users WHERE age > 20;

在這個例子中,通過為 age 列創建索引,當執行 WHERE 子句中包含 age 條件的查詢時,MySQL 可以利用該索引快速定位符合條件的記錄,提高查詢效率。

2. 避免在索引列上使用函數

  • 原理:如果在索引列上使用函數,MySQL 無法使用該索引進行快速查找,會導致全表掃描。
  • 錯誤示例
-- 查詢 name 以 'J' 開頭的用戶,這里使用了函數,無法使用索引
SELECT * FROM users WHERE LEFT(name, 1) = 'J';
  • 正確示例
-- 使用 LIKE 操作符代替函數,可使用索引
SELECT * FROM users WHERE name LIKE 'J%';

3. 優化范圍查詢

  • 原理:范圍查詢(如 ><BETWEEN 等)可能會導致索引失效,特別是在復合索引中。盡量將范圍查詢放在條件的最后。
  • 示例
-- 創建復合索引
CREATE INDEX idx_age_name ON users (age, name);-- 優化后的查詢,將范圍查詢放在最后
SELECT * FROM users WHERE name = 'John' AND age > 20;

在這個例子中,先通過 name 列進行精確匹配,再進行 age 列的范圍查詢,這樣可以更有效地利用復合索引。

4. 避免使用 OR 連接條件

  • 原理:當 WHERE 子句中使用 OR 連接多個條件時,MySQL 可能無法使用索引,導致全表掃描。可以使用 UNION 代替 OR
  • 錯誤示例
-- 使用 OR 連接條件,可能無法使用索引
SELECT * FROM users WHERE age = 20 OR age = 30;
  • 正確示例
-- 使用 UNION 代替 OR,可使用索引
SELECT * FROM users WHERE age = 20
UNION
SELECT * FROM users WHERE age = 30;

通過以上優化方法,可以顯著提高 WHERE 子句的查詢性能,減少數據庫的響應時間。

范圍優化

在 MySQL 中,范圍查詢(如使用 ><>=<=BETWEEN 等操作符)是常見的查詢需求,但如果處理不當,可能會導致性能問題。以下從多個方面介紹范圍查詢的優化方法:

1. 索引優化

合理創建索引
  • 對于經常用于范圍查詢的列,應該創建合適的索引。例如,如果經常對 users 表的 age 列進行范圍查詢,就可以為 age 列創建索引。
-- 創建 users 表
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50),age INT
);
-- 為 age 列創建索引
CREATE INDEX idx_age ON users (age);
  • 當執行 SELECT * FROM users WHERE age > 20; 這樣的范圍查詢時,MySQL 可以利用 idx_age 索引快速定位到符合條件的記錄。
復合索引的使用與順序
  • 當查詢涉及多個列的范圍條件時,需要合理創建復合索引。例如,有一個查詢 SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31' AND amount > 1000;,可以創建一個包含 order_dateamount 的復合索引。
-- 創建 orders 表
CREATE TABLE orders (order_id INT PRIMARY KEY,order_date DATE,amount DECIMAL(10, 2)
);
-- 創建復合索引
CREATE INDEX idx_order_date_amount ON orders (order_date, amount);
  • 復合索引中列的順序很重要,一般將選擇性高的列放在前面。在這個例子中,order_date 的選擇性可能更高,所以放在前面。

2. 查詢語句優化

避免在索引列上使用函數
  • 在范圍查詢的條件中,如果對索引列使用函數,會導致索引失效。例如,以下查詢無法使用 age 列的索引:
SELECT * FROM users WHERE YEAR(birth_date) > 1990;
  • 可以將其改寫為不使用函數的形式:
SELECT * FROM users WHERE birth_date > '1990-12-31';
范圍條件的位置
  • 在復合索引中,范圍查詢條件盡量放在后面。例如,對于復合索引 (col1, col2, col3),如果查詢條件為 col1 = 'value1' AND col2 > 10 AND col3 = 'value3',應該將 col2 > 10 這個范圍條件放在最后,因為 MySQL 在使用復合索引時,遇到范圍查詢后,后續的索引列可能無法有效使用。

3. 數據庫配置優化

調整緩沖池大小
  • 緩沖池(InnoDB Buffer Pool)用于緩存數據和索引頁,適當增大緩沖池的大小可以提高范圍查詢的性能。可以通過修改 innodb_buffer_pool_size 參數來調整緩沖池大小。例如,在 my.cnfmy.ini 配置文件中添加或修改以下內容:
[mysqld]
innodb_buffer_pool_size = 2G
  • 上述配置將緩沖池大小設置為 2GB,具體大小需要根據服務器的內存和實際業務情況進行調整。
調整查詢緩存
  • 查詢緩存可以緩存查詢結果,對于相同的范圍查詢,如果結果已經被緩存,就可以直接返回,減少查詢時間。可以通過設置 query_cache_typequery_cache_size 參數來啟用和調整查詢緩存的大小。例如:
[mysqld]
query_cache_type = 1
query_cache_size = 64M
  • 不過,需要注意的是,查詢緩存對于頻繁更新的表可能效果不佳,因為每次表更新時,相關的查詢緩存都會失效。

4. 數據分區優化

按范圍分區
  • 對于數據量較大的表,可以考慮使用數據分區。例如,對于 orders 表,可以按照 order_date 進行范圍分區。
-- 創建按范圍分區的 orders 表
CREATE TABLE orders (order_id INT,order_date DATE,amount DECIMAL(10, 2)
)
PARTITION BY RANGE (YEAR(order_date)) (PARTITION p2023 VALUES LESS THAN (2024),PARTITION p2024 VALUES LESS THAN (2025),PARTITION p2025 VALUES LESS THAN (2026)
);
  • 當執行范圍查詢 SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'; 時,MySQL 只需要在 p2024 分區中查找數據,減少了掃描的數據量。

索引合并優化

索引合并優化(Index Merge Optimization)是 MySQL 數據庫中的一種重要優化策略,當一個查詢的 WHERE 子句中包含多個條件,且每個條件都可以使用不同的索引時,MySQL 可以通過索引合并的方式來提高查詢效率。以下為你詳細介紹索引合并優化的相關內容:

1. 索引合并的類型

交集合并(Intersection Merge)
  • 原理:當查詢的條件可以通過多個索引分別篩選出一部分結果,并且這些結果需要同時滿足時,MySQL 會使用交集合并。即通過多個索引分別定位到符合各自條件的記錄,然后取這些記錄的交集。
  • 示例
-- 創建表
CREATE TABLE products (id INT PRIMARY KEY,category_id INT,price DECIMAL(10, 2),INDEX idx_category (category_id),INDEX idx_price (price)
);
-- 插入示例數據
INSERT INTO products (id, category_id, price) VALUES (1, 1, 10.00), (2, 2, 20.00), (3, 1, 30.00);
-- 查詢語句
SELECT * FROM products 
WHERE category_id = 1 AND price > 20;

在這個例子中,idx_category 索引可以快速定位 category_id = 1 的記錄,idx_price 索引可以快速定位 price > 20 的記錄,MySQL 會對這兩個索引的結果取交集,得到最終符合條件的記錄。

并集合并(Union Merge)
  • 原理:當查詢的條件可以通過多個索引分別篩選出一部分結果,并且這些結果只需要滿足其中一個條件即可時,MySQL 會使用并集合并。即通過多個索引分別定位到符合各自條件的記錄,然后取這些記錄的并集。
  • 示例
SELECT * FROM products 
WHERE category_id = 1 OR price > 20;

在這個例子中,idx_category 索引定位 category_id = 1 的記錄,idx_price 索引定位 price > 20 的記錄,MySQL 會將這兩個索引的結果合并,得到最終符合條件的記錄。

排序并集合并(Sort-Union Merge)
  • 原理:當并集合并的結果需要排序時,MySQL 會使用排序并集合并。它會先通過多個索引分別定位到符合各自條件的記錄,然后將這些記錄合并,并進行排序。
  • 示例
SELECT * FROM products 
WHERE category_id = 1 OR price > 20
ORDER BY id;

在這個例子中,除了進行并集合并外,還需要對結果按照 id 進行排序,MySQL 會使用排序并集合并來完成這個操作。

2. 索引合并優化的條件

  • 多個獨立索引:查詢的 WHERE 子句中必須有多個條件,且每個條件都可以使用不同的獨立索引。
  • 索引類型支持:目前 MySQL 支持對 BTREE 索引進行索引合并優化,其他類型的索引可能不支持。
  • 查詢復雜度:查詢的復雜度不能過高,否則 MySQL 可能會選擇其他的優化策略。

3. 查看索引合并優化是否生效

可以使用 EXPLAIN 語句來查看查詢是否使用了索引合并優化。例如:

EXPLAIN SELECT * FROM products 
WHERE category_id = 1 AND price > 20;

EXPLAIN 的結果中,如果 Extra 列顯示 Using index merge; Using intersect(idx_category,idx_price),則表示使用了交集合并優化;如果顯示 Using index merge; Using union(idx_category,idx_price),則表示使用了并集合并優化。

4. 索引合并優化的局限性

  • 性能開銷:雖然索引合并可以提高查詢效率,但在某些情況下,合并多個索引的結果也會帶來一定的性能開銷,特別是當索引結果集較大時。
  • 復合索引優先:如果可以通過創建復合索引來滿足查詢需求,通常復合索引的性能會優于索引合并。例如,對于上述 products 表,如果經常執行 WHERE category_id = 1 AND price > 20 這樣的查詢,可以創建復合索引 CREATE INDEX idx_category_price ON products (category_id, price);

哈希聯接優化

哈希聯接(Hash Join)是數據庫中用于連接兩個表的一種重要算法,在 MySQL 等數據庫系統中,通過合理運用哈希聯接優化策略,可以顯著提升查詢性能。下面從哈希聯接的原理、優化方法、使用場景、局限性等方面詳細介紹。

原理

哈希聯接主要用于處理兩個表之間的連接操作,其基本步驟如下:

  1. 構建階段(Build Phase):選擇較小的表(通常稱為構建表),對連接鍵(用于連接兩個表的列)進行哈希運算,將表中的每一行數據根據哈希值存儲到對應的哈希桶中,形成一個哈希表。
  2. 探查階段(Probe Phase):遍歷較大的表(通常稱為探查表),對探查表中的每一行數據的連接鍵執行相同的哈希運算,根據哈希值找到對應的哈希桶,然后在該哈希桶中查找匹配的行,從而完成連接操作。

優化方法

1. 表大小選擇
  • 原理:由于構建哈希表需要消耗一定的內存和時間,選擇較小的表作為構建表可以減少構建哈希表的開銷,提高整體性能。
  • 示例:假設有兩個表 orderscustomersorders 表數據量較大,customers 表數據量較小,在進行連接查詢時,可以讓 MySQL 優先選擇 customers 表作為構建表。
-- 連接查詢示例
SELECT * 
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;
2. 內存分配
  • 原理:足夠的內存可以確保哈希表能夠完整地存儲在內存中,避免頻繁的磁盤 I/O 操作。可以通過調整相關的系統參數來增加哈希聯接的內存分配。
  • 示例:在 MySQL 中,可以通過修改 join_buffer_size 參數來增加連接緩沖區的大小,該緩沖區可用于存儲哈希表。
-- 在 my.cnf 或 my.ini 配置文件中修改參數
[mysqld]
join_buffer_size = 2M
3. 數據類型匹配
  • 原理:確保連接鍵的數據類型一致,避免在連接過程中進行數據類型轉換,因為數據類型轉換會增加額外的計算開銷,影響性能。
  • 示例:如果 orders 表和 customers 表的 customer_id 列都是 INT 類型,在進行連接操作時就不會有數據類型轉換的問題。
-- 創建表時確保數據類型一致
CREATE TABLE orders (order_id INT,customer_id INT
);CREATE TABLE customers (customer_id INT,customer_name VARCHAR(50)
);

使用場景

  • 大數據集連接:當需要連接兩個大數據集時,哈希聯接通常比嵌套循環聯接(Nested Loop Join)等其他連接算法更高效,因為它可以減少不必要的比較次數。
  • 無索引連接:當連接鍵上沒有合適的索引時,哈希聯接可以發揮較好的性能,因為它不需要依賴索引來查找匹配的行。

局限性

  • 內存需求:哈希聯接需要足夠的內存來存儲哈希表,如果內存不足,可能會導致哈希表溢出到磁盤,從而產生大量的磁盤 I/O 操作,嚴重影響性能。
  • 數據傾斜:如果連接鍵的數據分布不均勻,可能會導致某些哈希桶中的數據過多,而其他哈希桶中的數據過少,這種數據傾斜問題會影響哈希聯接的性能。例如,某些 customer_id 出現的頻率遠高于其他 customer_id,會導致對應的哈希桶數據量過大。

查看哈希聯接是否使用

可以使用 EXPLAIN 語句來查看查詢是否使用了哈希聯接。例如:

EXPLAIN SELECT * 
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;

EXPLAIN 的結果中,如果 Extra 列顯示與哈希聯接相關的信息,如 Using hash join,則表示使用了哈希聯接。

引擎條件下推優化

引擎條件下推優化

定義

引擎條件下推優化(Engine Condition Pushdown Optimization)是數據庫管理系統(如 MySQL)中一種重要的查詢優化技術。其核心思想是將部分查詢條件盡可能早地傳遞給存儲引擎進行處理,而不是在服務器層過濾數據,從而減少從存儲引擎傳輸到服務器層的數據量,提高查詢性能。

原理

在傳統的查詢處理流程中,存儲引擎會將滿足索引條件的所有數據行返回給服務器層,然后服務器層再根據 WHERE 子句中的其他條件對這些數據行進行過濾。而引擎條件下推優化打破了這種模式,它允許存儲引擎在檢索數據時就利用額外的查詢條件進行過濾,只將符合這些條件的數據行返回給服務器層。

示例

假設有一個 employees 表,包含 employee_iddepartment_idsalaryhire_date 等列,并且在 department_id 列上有索引。執行以下查詢:

SELECT * 
FROM employees 
WHERE department_id = 10 AND salary > 5000;
  • 未使用引擎條件下推優化:存儲引擎會根據 department_id 索引找到所有 department_id = 10 的數據行,然后將這些行全部返回給服務器層。服務器層再對這些返回的數據行進行篩選,過濾出 salary > 5000 的行。
  • 使用引擎條件下推優化:存儲引擎不僅會利用 department_id 索引找到 department_id = 10 的數據行,還會在檢索過程中同時檢查 salary > 5000 這個條件,只將同時滿足這兩個條件的數據行返回給服務器層,減少了數據傳輸量和服務器層的處理負擔。
開啟和限制
  • 開啟:在 MySQL 中,默認情況下引擎條件下推優化是開啟的。可以通過設置 optimizer_switch 系統變量來控制其開關狀態,例如:
-- 開啟引擎條件下推優化
SET optimizer_switch = 'engine_condition_pushdown=on';
  • 限制:并非所有的查詢條件都能進行下推,例如包含子查詢、函數調用或某些復雜表達式的條件可能無法下推到存儲引擎進行處理。

索引條件下推優化(Index Condition Pushdown Optimization)

索引條件下推優化(Index Condition Pushdown Optimization)

定義

索引條件下推(Index Condition Pushdown,簡稱 ICP)是 MySQL 數據庫中一種重要的查詢優化技術,主要用于提升查詢性能。該優化技術允許 MySQL 在使用索引進行數據檢索時,將部分 WHERE 子句中的條件下推到存儲引擎層進行過濾,而不是像傳統方式那樣將所有滿足索引范圍的記錄都返回給服務器層,再由服務器層進行過濾。

原理
  • 傳統查詢流程:在沒有使用 ICP 優化時,存儲引擎根據索引定位到符合索引條件的記錄后,會將這些記錄全部返回給服務器層,服務器層再根據 WHERE 子句中的其他條件進行過濾。
  • ICP 優化流程:當啟用 ICP 時,存儲引擎會在索引掃描過程中,將 WHERE 子句中可以使用索引進行判斷的條件下推到存儲引擎層進行過濾。只有滿足這些條件的記錄才會被讀取并返回給服務器層,這樣可以顯著減少從存儲引擎傳輸到服務器層的數據量,從而提高查詢效率。
示例

假設有一個 employees 表,包含 idnamedepartment_idsalary 等列,并且在 department_idname 上創建了復合索引 idx_department_name (department_id, name)。執行以下查詢:

SELECT * 
FROM employees 
WHERE department_id = 10 AND name LIKE 'J%';
  • 未使用 ICP 優化:存儲引擎根據 idx_department_name 索引找到所有 department_id = 10 的記錄,然后將這些記錄全部返回給服務器層。服務器層再對這些記錄進行過濾,篩選出 name LIKE 'J%' 的記錄。
  • 使用 ICP 優化:存儲引擎在掃描 idx_department_name 索引時,會同時檢查 department_id = 10name LIKE 'J%' 這兩個條件。只有同時滿足這兩個條件的記錄才會被讀取并返回給服務器層,減少了不必要的數據傳輸和服務器層的處理負擔。
開啟和關閉
  • 默認情況:在 MySQL 5.6 及以上版本中,索引條件下推優化默認是開啟的。
  • 手動控制:可以通過設置 optimizer_switch 系統變量來開啟或關閉 ICP 優化。例如:
-- 開啟 ICP 優化
SET optimizer_switch = 'index_condition_pushdown=on';
-- 關閉 ICP 優化
SET optimizer_switch = 'index_condition_pushdown=off';
適用場景和限制
  • 適用場景:當查詢條件中包含可以使用索引進行過濾的部分,且表的數據量較大時,ICP 優化可以顯著提高查詢性能。
  • 限制:ICP 優化只適用于 MyISAMInnoDB 存儲引擎。對于某些復雜的查詢條件,如包含子查詢、函數調用等,可能無法進行有效的 ICP 優化。

引擎條件下推優化和索引條件下推優化(Index Condition Pushdown Optimization)感覺是同一個東西?

引擎條件下推優化和索引條件下推優化有相似之處,但并不是同一個東西,下面從概念、條件應用范圍、適用場景等方面來詳細分析它們的區別和聯系:

相似點

  • 核心目標一致:二者的主要目的都是為了減少從存儲引擎傳輸到服務器層的數據量,從而提高查詢性能。它們都嘗試將原本在服務器層進行的部分過濾操作提前到存儲引擎層執行,避免不必要的數據傳輸和處理。
  • 優化方式類似:都是通過將查詢條件下推到更底層(存儲引擎)來進行過濾,使得服務器層可以處理更少的數據,進而加快查詢速度。

不同點

概念范疇
  • 引擎條件下推優化:是一個更寬泛的概念,它指的是將查詢中的部分條件盡可能早地傳遞給存儲引擎進行處理,這些條件不局限于索引相關的條件。只要存儲引擎能夠處理這些條件,就可以進行下推。
  • 索引條件下推優化(ICP):是一種特定的、基于索引的優化技術。它主要針對 WHERE 子句中那些可以利用索引進行判斷的條件,將這些條件下推到存儲引擎在索引掃描過程中進行過濾。
條件應用范圍
  • 引擎條件下推優化:可以處理更多類型的條件,不僅僅依賴于索引。例如,一些不涉及索引列但存儲引擎能夠處理的條件也可能會被下推。
  • 索引條件下推優化:只關注那些可以利用索引來評估的條件。如果查詢條件不能通過索引進行判斷,就不會應用 ICP 優化。
適用場景
  • 引擎條件下推優化:適用于各種存儲引擎和查詢場景,尤其是當查詢條件較為復雜,包含非索引列的過濾條件時,該優化可以發揮作用。
  • 索引條件下推優化:主要適用于存在合適索引的查詢場景。當查詢可以使用索引來定位數據,并且 WHERE 子句中有基于索引列的過濾條件時,ICP 優化能夠顯著提高性能。
示例對比
  • 引擎條件下推優化示例
SELECT * 
FROM products 
WHERE category = 'electronics' AND weight > 10;

如果存儲引擎能夠在數據讀取時同時處理 category = 'electronics'weight > 10 這兩個條件,那么引擎條件下推優化會將這兩個條件都下推到存儲引擎進行過濾。

  • 索引條件下推優化示例
SELECT * 
FROM employees 
WHERE department_id = 10 AND name LIKE 'J%';

假設在 department_idname 上有復合索引,索引條件下推優化會將 department_id = 10name LIKE 'J%' 這兩個基于索引列的條件下推到存儲引擎在索引掃描時進行過濾。

嵌套循環連接算法(Nested - Loop Join Algorithms)

在 MySQL 中,嵌套循環連接算法(Nested - Loop Join Algorithms)是用于執行表連接操作的基本算法之一,它有多種變體,每種變體在不同場景下具有不同的性能表現。下面為你詳細介紹這些算法及其在 MySQL 中的應用。

1. 簡單嵌套循環連接(Simple Nested - Loop Join,SNLJ)

原理

簡單嵌套循環連接是最基礎的嵌套循環連接算法。它使用兩層嵌套循環,外層循環遍歷驅動表的每一行,對于驅動表的每一行,內層循環遍歷被驅動表的所有行,檢查是否滿足連接條件,若滿足則將這兩行組合添加到結果集中。

示例 SQL 及分析
SELECT * 
FROM table1
JOIN table2 ON table1.id = table2.id;

當 MySQL 采用簡單嵌套循環連接算法執行該查詢時,會逐行讀取 table1 中的每一行,然后針對 table1 中的每一行,遍歷 table2 中的所有行,比較 table1.idtable2.id 是否相等。

性能特點

時間復雜度為 O ( m ? n ) O(m * n) O(m?n),其中 m m m 是驅動表的行數, n n n 是被驅動表的行數。當表的數據量較大時,性能會非常差,因為需要進行大量的比較操作。

2. 塊嵌套循環連接(Block Nested - Loop Join,BNLJ)

原理

為了減少內層循環中被驅動表的掃描次數,塊嵌套循環連接引入了一個緩沖區。它將驅動表的數據分成多個塊,每次將一個塊的數據加載到緩沖區中,然后對被驅動表進行一次掃描,將緩沖區中的每一行與被驅動表的每一行進行比較。

示例 SQL 及分析
SELECT * 
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;

假設 orders 表是驅動表,customers 表是被驅動表。MySQL 會將 orders 表的數據按一定大小分成塊,每次將一個塊的數據放入 join_buffer 中,然后掃描 customers 表,將 join_buffer 中的

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

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

相關文章

【圖論】判斷圖中有環的兩種方法及實現

判斷圖中有環的兩種方法及實現 在圖論中&#xff0c;檢測有向圖是否存在環是常見問題。本文將介紹兩種主流方法&#xff1a;DFS三色標記法和拓撲排序&#xff08;Kahn算法&#xff09;&#xff0c;并提供對應的C代碼實現。 方法一&#xff1a;DFS三色標記法 核心思想 通過深…

11.【線性代數】——矩陣空間,秩1矩陣,小世界圖

十一 矩陣空間&#xff0c;秩1矩陣&#xff0c;小世界圖 1. 矩陣空間交集 和 和集 2. 所有解空間3. r 1 r1 r1的矩陣4. 題目5. 小世界圖 空間&#xff1a;組成空間的元素的線性組合都在這個空間中。 1. 矩陣空間 舉例&#xff1a;矩陣空間&#xff08; M M M 所有3x3的矩陣&…

【網絡安全 | 滲透測試】GraphQL精講一:基礎知識

未經許可,不得轉載, 文章目錄 GraphQL 定義GraphQL 工作原理GraphQL 模式GraphQL 查詢GraphQL 變更(Mutations)查詢(Queries)和變更(Mutations)的組成部分字段(Fields)參數(Arguments)變量別名(Aliases)片段(Fragments)訂閱(Subscriptions)自省(Introspecti…

關于虛擬環境中遇到的bug

conda和cmd介紹 介紹 Conda 概述&#xff1a; Conda是一個開源包管理系統和環境管理系統&#xff0c;尤其適用于Python和R語言的開發環境。它允許用戶創建獨立的虛擬環境&#xff0c;方便地管理依賴包和軟件版本。 特點&#xff1a; 環境管理&#xff1a;可以創建、導入、導…

基于nginx的灰度發布解決方案

Nginx 在灰度發布中可以看作是一個精確的流量調度員&#xff0c;它充當著客戶端與后端服務器之間的中介。通過配置好的規則&#xff0c;Nginx 會將用戶請求智能地引導到不同版本的服務上。這樣&#xff0c;Nginx 可以根據具體需求靈活地分配流量&#xff0c;確保新版本逐步推向…

網絡安全法與等級保護 PPT 精華匯總

資源描述 本資源文件為《網絡安全法與等級保護》的PPT精華匯總&#xff0c;內容涵蓋了網絡安全法與等級保護的總體框架及相關標準規范。該PPT詳細介紹了網絡安全法與等級保護的各個章節和條款&#xff0c;并提供了基礎類和應用類的相關標準文件&#xff0c;幫助讀者全面了解和…

uni-app開發安卓和iOS 打包流程(云打包)

首先講一下安卓打包的流程,之后再說ios。打包安卓和iOS打包的流程有些不同,安卓打包相對來說比較簡單,而iOS打包需要更多的準備工作,如申請開發者賬號、生成證書等。 一、安卓打包 1、安卓打包直接在window電腦上就可以操作,打開hbuilderx,找到你的項目選中,然后點擊發…

攝像頭應用編程(四):ARM Linux LCD實時預覽UVC攝像頭畫面

文章目錄 1、前言2、環境介紹3、步驟4、應用程序編寫4.1、lcd初始化4.2、攝像頭初始化4.3、jpeg解碼4.4、開啟攝像頭4.5、完整的程序如下 5、測試5.1、編譯應用程序5.2、運行應用程序 6、總結 1、前言 本次應用程序主要針對支持MJPEG格式輸出的UVC攝像頭。 2、環境介紹 rk35…

藍橋與力扣刷題(藍橋 k倍區間)

題目&#xff1a;給定一個長度為 N 的數列&#xff0c;A1,A2,?AN?&#xff0c;如果其中一段連續的子序列 Ai,Ai1,?Aj( i≤j ) 之和是 K 的倍數&#xff0c;我們就稱這個區間[i,j] 是 K 倍區間。 你能求出數列中總共有多少個 K 倍區間嗎&#xff1f; 輸入描述 第一行包含兩…

json介紹、python數據和json數據的相互轉換

目錄 一 json介紹 json是什么&#xff1f; 用處 Json 和 XML 對比 各語言對Json的支持情況 Json規范詳解 二 python數據和json數據的相互轉換 dumps() : 轉換成json loads(): 轉換成python數據 總結 一 json介紹 json是什么&#xff1f; 實質上是一條字符串 是一種…

PAT乙級真題 / 知識點(1)

引言&#xff1a; 起初&#xff0c;報PAT是伙伴推薦。但在報名路途中&#xff0c;有朋友說&#xff0c;花時間到這上面不值得&#xff0c;還有學長說沒聽過&#xff0c;野雞杯。 我一笑而過&#xff0c;我可能就是偏執&#xff0c;我就是想報。隨著刷真題&#xff0c;我的基礎…

單細胞分析(20)——inferCNV分析

InferCNV分析筆記 1. 分析目標 InferCNV&#xff08;Inference of Copy Number Variations&#xff09;是一種基于單細胞轉錄組數據推斷**拷貝數變異&#xff08;CNV&#xff09;**的方法&#xff0c;推測其基因組變異情況。 2. 數據準備 2.1 載入數據 library(Seurat) set…

C++:多態與虛函數

1.虛函數&#xff0c;在函數前加virtual即可。有虛函數時&#xff0c;父類指針指向父類對象時就會使用父類的成員&#xff0c;指向子類對象時就可以使用子類成員&#xff0c;進而我們引入了多態的概念。 2.多態&#xff1a;父類指針指向子類的對象&#xff0c;通過父類指針調用…

WSL下使用git克隆失敗解決

WSL默認nat模式&#xff0c;別動了防火墻放行&#xff0c;見圖1git導入[bash1]&#xff0c;ip為你wsl上linxu通過ifconfig獲取的本機ip&#xff0c;端口對好某alcsh軟件開啟tun模式【經過測試&#xff0c;不開也行】應該成了&#xff0c;如果不行&#xff0c;修改.wslconfig為下…

開放鴻蒙OpenHarmony 5.0.0 Release 兼容性測試實戰經驗分享

OpenHarmony 5.0版本的發布時間是2024年12月20日至21日。這個版本帶來了許多新特性和改進。現在5.0出了兩個release 版本&#xff0c;分別是5.0.0和5.0.1。 就在5.0版本發布不到2周的時間內&#xff0c;2025年01月01日起&#xff0c;不支持新產品基于老分支&#xff08;OpenHar…

C++中explicit關鍵字的含義以及用法

在C中&#xff0c;explicit關鍵字用于修飾構造函數和轉換運算符&#xff08;C11起&#xff09;&#xff0c;防止編譯器進行隱式類型轉換&#xff0c;要求必須顯式調用構造函數或轉換操作。以下是其核心用法和示例&#xff1a; 1. 修飾構造函數 用途 禁止隱式構造對象&#xf…

Oracle OCP認證考試考點詳解083系列01

題記&#xff1a; 本系列主要講解Oracle OCP認證考試考點&#xff08;題目&#xff09;&#xff0c;適用于19C/21C,跟著學OCP考試必過。 1. 第1題&#xff1a; 題目 解析及答案&#xff1a; 關于自動工作量存儲庫&#xff08;AWR&#xff09;快照&#xff0c;以下哪三個選項…

從DNS到TCP:DNS解析流程和瀏覽器輸入域名訪問流程

1 DNS 解析流程 1.1 什么是DNS域名解析 在生活中我們會經常遇到域名&#xff0c;比如說CSDN的域名www.csdn.net&#xff0c;百度的域名www.baidu.com,我們也會碰到IP&#xff0c;現在目前有的是IPV4&#xff0c;IPV6。那這兩個有什么區別呢&#xff1f;IP地址是互聯網上計算機…

《2025軟件測試工程師面試》接口測試篇

基礎概念 什么是接口測試? 接口測試是測試系統組件間接口的一種測試,主要用于檢測外部系統和內部系統之間以及各個子系統之間的交互點。測試的重點是檢查數據的交換、傳遞和控制管理的過程,以及系統間的相互邏輯依賴關系等。 接口測試的優勢是什么? 接口測試具有規范性與擴…

【PHP腳本語言詳解】為什么直接訪問PHP文件會顯示空白?從錯誤示例到正確執行!

前言 作為一名開發者&#xff0c;你是否曾經遇到過這樣的問題&#xff1a;寫了一個PHP腳本&#xff0c;放到服務器根目錄后&#xff0c;直接通過file:///路徑訪問卻顯示空白頁面&#xff1f;而換成http://localhost卻能正常顯示&#xff1f;這篇文章將帶你深入理解PHP腳本語言…