關于MySQL的索引

一、索引

1、索引概述

1.1、介紹

索引 index )是幫助 MySQL 高效獲取數據的數據結構 ( 有序 ) 。在數據之外,數據庫系統還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據, 這樣就可以在這些數據結構上實現高級查找算法,這種數據結構就是索引。

1.2、特點

2、索引結構

2.1、概述

MySQL 的索引是在存儲引擎層實現的,不同的存儲引擎有不同的索引結構,主要包含以下幾種:
上述是 MySQL 中所支持的所有的索引結構,接下來,我們再來看看不同的存儲引擎對于索引結構的支持情況。
注意: 我們平常所說的索引,如果沒有特別指明,都是指 B+ 樹結構組織的索引。

2.2、B+Tree

B+Tree B-Tree 的變種,我們以一顆最大度數( max-degree )為 4 4 階)的 b+tree 為例,來看一
下其結構示意圖:
我們可以看到,兩部分:
  • 綠色框框起來的部分,是索引部分,僅僅起到索引數據的作用,不存儲數據。
  • 紅色框框起來的部分,是數據存儲部分,在其葉子節點中要存儲具體的數據。
知識小貼士 : 樹的度數指的是一個節點的子節點個數。

2.3、MySQL里的B+tree索引結構

MySQL索引數據結構對經典的B+Tree進行了優化。在原B+Tree的基礎上,增加一個指向相鄰葉子節點的鏈表指針,就形成了帶有順序指針的B+Tree,提高區間訪問的性能,利于排序。

2.4、Hash

MySQL 中除了支持 B+Tree 索引,還支持一種索引類型 ---Hash 索引。
2.4.1結構
哈希索引就是采用一定的 hash 算法,將鍵值換算成新的 hash 值,映射到對應的槽位上,然后存儲在
hash 表中。
如果兩個 ( 或多個 ) 鍵值,映射到一個相同的槽位上,他們就產生了 hash 沖突(也稱為 hash 碰撞),可以通過鏈表來解決。
2.4.2特點
  1. Hash索引只能用于對等比較(=in),不支持范圍查詢(between>< ...
  2. 無法利用索引完成排序操作
  3. 查詢效率高,通常(不存在hash沖突的情況)只需要一次檢索就可以了,效率通常要高于B+tree
2.4.3存儲引擎支持
MySQL 中,支持 hash 索引的是 Memory 存儲引擎。 而 InnoDB 中具有自適應 hash 功能, hash 索引是InnoDB存儲引擎根據 B+Tree 索引在指定條件下自動構建的。
思考題: 為什么InnoDB存儲引擎選擇使用B+tree索引結構?
  1. 相對于二叉樹,層級更少,搜索效率高;
  2. 對于B-tree,無論是葉子節點還是非葉子節點,都會保存數據,這樣導致一頁中存儲的鍵值減少,指針跟著減少,要同樣保存大量數據,只能增加樹的高度,導致性能降低;
  3. 相對Hash索引,B+tree支持范圍匹配及排序操作;

3、索引分類

3.1、索引分類

MySQL 數據庫,將索引的具體類型主要分為以下幾類:主鍵索引、唯一索引、常規索引、全文索引。

3.2、聚集索引&二級索引

而在在 InnoDB 存儲引擎中,根據索引的存儲形式,又可以分為以下兩種:

聚集索引選取規則 :
  • 如果存在主鍵,主鍵索引就是聚集索引。
  • 如果不存在主鍵,將使用第一個唯一(UNIQUE)索引作為聚集索引。
  • 如果表沒有主鍵,或沒有合適的唯一索引,則InnoDB會自動生成一個rowid作為隱藏的聚集索 引。
聚集索引和二級索引的具體結構如下:
  • 聚集索引的葉子節點下掛的是這一行的數據 。
  • 二級索引的葉子節點下掛的是該字段值對應的主鍵值。
接下來,我們來分析一下,當我們執行如下的 SQL 語句時,具體的查找過程是什么樣子的。
具體過程如下 :
  1. 由于是根據name字段進行查詢,所以先根據name='Arm'name字段的二級索引中進行匹配查找。但是在二級索引中只能查找到 Arm 對應的主鍵值 10
  2. 由于查詢返回的數據是*,所以此時,還需要根據主鍵值10,到聚集索引中查找10對應的記錄,最終找到10對應的行row
  3. 最終拿到這一行的數據,直接返回即可。
回表查詢: 這種先到二級索引中查找數據,找到主鍵值,然后再到聚集索引中根據主鍵值,獲取
數據的方式,就稱之為回表查詢。

4、索引語法

  1. 創建索引 :?
    CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (
    index_col_name,... ) ;
  2. 查找索引 :?
    SHOW INDEX FROM table_name ;
  3. 刪除索引 :?
    DROP INDEX index_name ON table_name ;

5、SQL性能分析

5.1、SQL執行頻率

MySQL 客戶端連接成功后,通過 show [session|global] status 命令可以提供服務器狀態信
息。通過如下指令,可以查看當前數據庫的 INSERT UPDATE DELETE SELECT 的訪問頻次
-- session 是查看當前會話 ;
-- global 是查詢全局數據 ;
SHOW GLOBAL STATUS LIKE 'Com_______';

Com_delete:? ? 刪除次數
Com_insert:? ? 插入次數
Com_select:? ? 查詢次數
Com_update:?? 更新次數

我們可以在當前數據庫再執行幾次查詢操作,然后再次查看執行頻次,看看 Com_select 參數會不會變化。

通過上述指令,我們可以查看到當前數據庫到底是以查詢為主,還是以增刪改為主,從而為數據 庫優化提供參考依據。 如果是以增刪改為主,我們可以考慮不對其進行索引的優化。如果是以查詢為主,那么就要考慮對數據庫的索引進行優化了。
那么通過查詢 SQL 的執行頻次,我們就能夠知道當前數據庫到底是增刪改為主,還是查詢為主。 那假如說是以查詢為主,我們又該如何定位針對于那些查詢語句進行優化呢? 次數我們可以借助于慢查詢日志。
接下來,我們就來介紹一下 MySQL 中的慢查詢日志

5.2、慢查詢日志

慢查詢日志記錄了所有執行時間超過指定參數( long_query_time ,單位:秒,默認 10 秒)的所有
SQL 語句的日志。
MySQL 的慢查詢日志默認沒有開啟,我們可以查看一下系統變量 slow_query_log

如果要開啟慢查詢日志,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

# 開啟MySQL慢日志查詢開關
slow_query_log=1
# 設置慢日志的時間為2秒,SQL語句執行時間超過2秒,就會視為慢查詢,記錄慢查詢日志
long_query_time=2
配置完畢之后,通過以下指令重新啟動 MySQL 服務器進行測試,查看慢日志文件中記錄的信息
/var/lib/mysql/localhost-slow.log
systemctl restart mysqld

然后,再次查看開關情況,慢查詢日志就已經打開了。

測試:
  1. 執行如下SQL語句 :?
    select * from tb_user; -- 這條SQL執行效率比較高, 執行耗時 0.00sec
    select count(*) from tb_sku; -- 由于tb_sku表中, 預先存入了1000w的記錄, count一次,耗時13.35sec
  2. 檢查慢查詢日志 : 最終我們發現,在慢查詢日志中,只會記錄執行時間超多我們預設時間(2s)的SQL,執行較快的SQL是不會記錄的。

那這樣,通過慢查詢日志,就可以定位出執行效率比較低的SQL,從而有針對性的進行優化。

5.3、profile詳情

show profiles 能夠在做 SQL 優化時幫助我們了解時間都耗費到哪里去了。通過 have_profiling
參數,能夠看到當前 MySQL 是否支持 profile 操作:
SELECT @@have_profiling ;

可以看到,當前 MySQL 是支持 profile 操作的,但是開關是關閉的。可以通過 set 語句在
session/global 級別開啟 profiling
SET profiling = 1;
開關已經打開了,接下來,我們所執行的 SQL 語句,都會被 MySQL 記錄,并記錄執行時間消耗到哪兒去了。 我們直接執行如下的SQL 語句:
select * from tb_user;
select * from tb_user where id = 1;
select * from tb_user where name = '白起';
select count(*) from tb_sku;
執行一系列的業務 SQL 的操作,然后通過如下指令查看指令的執行耗時:
-- 查看每一條SQL的耗時基本情況
show profiles;
-- 查看指定query_id的SQL語句各個階段的耗時情況
show profile for query query_id;
-- 查看指定query_id的SQL語句CPU的使用情況
show profile cpu for query query_id;
查看每一條 SQL 的耗時情況 :
查看指定 SQL 各個階段的耗時情況 :

5.4、explain

EXPLAIN 或者 DESC 命令獲取 MySQL 如何執行 SELECT 語句的信息,包括在 SELECT 語句執行過程中表如何連接和連接的順序。
-- 直接在select語句之前加上關鍵字 explain / desc
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 條件 ;

Explain 執行計劃中各個字段的含義 :

6、索引使用

6.1、驗證索引效率

在講解索引的使用原則之前,先通過一個簡單的案例,來驗證一下索引,看看是否能夠通過索引來提升數據查詢性能。在演示的時候,我們還是使用之前準備的一張表 tb_sku , 在這張表中準備了 1000w的記錄。
這張表中id 為主鍵,有主鍵索引,而其他字段是沒有建立索引的。 我們先來查詢其中的一條記錄,看看里面的字段情況,執行如下SQL
select * from tb_sku where id = 1\G;

可以看到即使有 1000w 的數據 , 根據 id 進行數據查詢 , 性能依然很快,因為主鍵 id 是有索引的。 那么接下來,我們再來根據 sn 字段進行查詢,執行如下 SQL
SELECT * FROM tb_sku WHERE sn = '100000003145001';

我們可以看到根據 sn 字段進行查詢,查詢返回了一條數據,結果耗時 20.78sec ,就是因為 sn 沒有索引,而造成查詢效率很低。
那么我們可以針對于 sn 字段,建立一個索引,建立了索引之后,我們再次根據 sn 進行查詢,再來看一下查詢耗時情況。
創建索引:
create index idx_sku_sn on tb_sku(sn) ;

然后再次執行相同的 SQL 語句,再次查看 SQL 的耗時。
SELECT * FROM tb_sku WHERE sn = '100000003145001';

我們明顯會看到, sn 字段建立了索引之后,查詢性能大大提升。建立索引前后,查詢耗時都不是一個數量級的。

6.2、最左前綴法則

如果索引了多列(聯合索引),要遵守最左前綴法則。最左前綴法則指的是查詢從索引的最左列開始,并且不跳過索引中的列。如果跳躍某一列,索引將會部分失效( 后面的字段索引失效 )
tb_user 表為例,我們先來查看一下之前 tb_user 表所創建的索引。
tb_user 表中,有一個聯合索引,這個聯合索引涉及到三個字段,順序分別為: profession
age status
對于最左前綴法則指的是,查詢時,最左邊的列,也就是 profession 必須存在,否則索引全部失效。而且中間不能跳過某一列,否則該列后面的字段索引將失效。 接下來,我們來演示幾組案例,看一下
具體的執行計劃:
explain select * from tb_user where profession = '軟件工程' and age = 31 and status = '0';

explain select * from tb_user where profession = '軟件工程' and age = 31;

explain select * from tb_user where profession = '軟件工程';

以上的這三組測試中,我們發現只要聯合索引最左邊的字段 profession 存在,索引就會生效,只不
過索引的長度不同。 而且由以上三組測試,我們也可以推測出 profession 字段索引長度為 47 age
字段索引長度為 2 status 字段索引長度為 5
explain select * from tb_user where age = 31 and status = '0';

explain select * from tb_user where status = '0';

而通過上面的這兩組測試,我們也可以看到索引并未生效,原因是因為不滿足最左前綴法則,聯合索引最左邊的列profession不存在。

explain select * from tb_user where profession = '軟件工程' and status = '0';

上述的 SQL 查詢時,存在 profession 字段,最左邊的列是存在的,索引滿足最左前綴法則的基本條
件。但是查詢時,跳過了 age 這個列,所以后面的列索引是不會使用的,也就是索引部分生效,所以索引的長度就是47
思考題:?

當執行SQL語句:
explain select * from tb_user where age = 31 and status = '0' and profession = '軟件工程';
時,是否滿足最左前綴法則,走不走上述的聯合索引,索引長度?
可以看到,是完全滿足最左前綴法則的,索引長度 54 ,聯合索引是生效的。
注意 : 最左前綴法則中指的最左邊的列,是指在查詢時,聯合索引的最左邊的字段 ( 即是
第一個字段 ) 必須存在,與我們編寫 SQL 時,條件編寫的先后順序無關。

6.3、范圍查詢

聯合索引中,出現范圍查詢 (>,<) ,范圍查詢右側的列索引失效。
explain select * from tb_user where profession = '軟件工程' and age > 30 and status = '0';

當范圍查詢使用 > < 時,走聯合索引了,但是索引的長度為 49 ,就說明范圍查詢右邊的 status
段是沒有走索引的。
所以,在業務允許的情況下,盡可能的使用類似于 >= <= 這類的范圍查詢,而避免使用 > < 。

6.4索引失效情況

6.4.1索引列運算

不要在索引列上進行運算操作, 索引將失效。

tb_user表中,除了前面介紹的聯合索引之外,還有一個索引,是phone字段的單列索引。

A. 當根據phone字段進行等值匹配查詢時, 索引生效。

explain select * from tb_user where phone = '17799990015';

B. 當根據 phone 字段進行函數運算操作之后,索引失效。
explain select * from tb_user where substring(phone,10,2) = '15';

6.4.2字符串不加引號
字符串類型字段使用時,不加引號,索引將失效。
如果字符串不加單引號,對于查詢結果,沒什么影響,但是數據庫存在隱式類型轉換,索引將失效。
6.4.3 模糊查詢
如果僅僅是尾部模糊匹配,索引不會失效。如果是頭部模糊匹配,索引失效。
接下來,我們來看一下這三條 SQL 語句的執行效果,查看一下其執行計劃:
由于下面查詢語句中,都是根據 profession 字段查詢,符合最左前綴法則,聯合索引是可以生效的,我們主要看一下,模糊查詢時,% 加在關鍵字之前,和加在關鍵字之后的影響。
explain select * from tb_user where profession like '軟件%';
explain select * from tb_user where profession like '%工程';
explain select * from tb_user where profession like '%工%';

經過上述的測試,我們發現, like 模糊查詢中,在關鍵字后面加 %,索引可以生效。而如果在關鍵字前面加了%,索引將會失效。
6.4.4or連接條件
or 分割開的條件, 如果 or 前的條件中的列有索引,而后面的列中沒有索引,那么涉及的索引都不會被用到。
explain select * from tb_user where id = 10 or age = 23;
explain select * from tb_user where phone = '17799990017' or age = 23;

?由于age沒有索引,所以即使idphone有索引,索引也會失效。所以需要針對于age也要建立索引。

然后,我們可以對 age 字段建立索引。
create index idx_user_age on tb_user(age);

?建立了索引之后,我們再次執行上述的SQL語句,看看前后執行計劃的變化

?

?最終,我們發現,當or連接的條件,左右兩側字段都有索引時,索引才會生效。

?6.4.5數據分布影響

?如果MySQL評估使用索引比全表更慢,則不使用索引。

select * from tb_user where phone >= '17799990005';
select * from tb_user where phone >= '17799990015';

?

經過測試我們發現,相同的 SQL 語句,只是傳入的字段值不同,最終的執行計劃也完全不一樣,這是為什么呢?
就是因為 MySQL 在查詢時,會評估使用索引的效率與走全表掃描的效率,如果走全表掃描更快,則放棄索引,走全表掃描。 因為索引是用來索引少量數據的,如果通過索引查詢返回大批量的數據,則還不如走全表掃描來的快,此時索引就會失效。
接下來,我們再來看看 is null is not null 操作是否走索引。
執行如下兩條語句 :
explain select * from tb_user where profession is null;
explain select * from tb_user where profession is not null;

?接下來,我們做一個操作將profession字段值全部更新為null

然后,再次執行上述的兩條SQL,查看SQL語句的執行計劃。

最終我們看到,一模一樣的 SQL 語句,先后執行了兩次,結果查詢計劃是不一樣的,為什么會出現這種
現象,這是和數據庫的數據分布有關系。查詢時 MySQL 會評估,走索引快,還是全表掃描快,如果全表
掃描更快,則放棄索引走全表掃描。 因此, is null is not null 是否走索引,得具體情況具體
分析,并不是固定的。

6.5SQL提示

目前tb_user表的數據情況如下

?索引情況如下:

?把上述的 idx_user_age, idx_email 這兩個之前測試使用過的索引直接刪除。

drop index idx_user_age on tb_user;
drop index idx_email on tb_user;
A. 執行 SQL : explain select * from tb_user where profession = ' 軟件工程 ';

?

查詢走了聯合索引。?

B. 執行 SQL ,創建 profession 的單列索引:
create index idx_user_pro on tb_user(profession);

?C. 創建單列索引后,再次執行A中的SQL語句,查看執行計劃,看看到底走哪個索引。

測試結果,我們可以看到, possible_keys idx_user_pro_age_sta,idx_user_pro 這兩個索引都可能用到,最終MySQL選擇了 idx_user_pro_age_sta 索引。這是MySQL自動選擇的結果。
那么,我們能不能在查詢的時候,自己來指定使用哪個索引呢? 答案是肯定的,此時就可以借助于MySQL的 SQL 提示來完成。 接下來,介紹一下 SQL 提示。
SQL提示,是優化數據庫的一個重要手段,簡單來說,就是在 SQL 語句中加入一些人為的提示來達到優化操作的目的。

  1. use index : 建議 MySQL 使用哪一個索引完成此次查詢(僅僅是建議, mysql 內部還會再次進行評估)。
    explain select * from tb_user use index(idx_user_pro) where profession = '軟件工程';

  2. ignore index : 忽略指定的索引。
    explain select * from tb_user ignore index(idx_user_pro) where profession = '軟件工程';

  3. force index : 強制使用索引

    explain select * from tb_user force index(idx_user_pro) where profession = '軟件工程';

?6.6覆蓋索引

盡量使用覆蓋索引,減少 select * 。 那么什么是覆蓋索引呢? 覆蓋索引是指 查詢使用了索引,并且需要返回的列,在該索引中已經全部能夠找到 。

?接下來,我們來看一組SQL的執行計劃,看看執行計劃的差別,然后再來具體做一個解析

explain select id, profession from tb_user where profession = '軟件工程' and age = 31 and status = '0' ;explain select id,profession,age, status from tb_user where profession = '軟件工程' and age = 31 and status = '0' ;explain select id,profession,age, status, name from tb_user where profession = '軟件工程' and age = 31 and status = '0' ;explain select * from tb_user where profession = '軟件工程' and age = 31 and status = '0';

?上述這幾條SQL的執行結果為:

從上述的執行計劃我們可以看到,這四條 SQL 語句的執行計劃前面所有的指標都是一樣的,看不出來差異。但是此時,我們主要關注的是后面的Extra ,前面兩天 SQL 的結果為 Using where; Using Index ; 而后面兩條 SQL 的結果為 : Using index condition

因為,在 tb_user 表中有一個聯合索引 idx_user_pro_age_sta ,該索引關聯了三個字段profession、 age status ,而這個索引也是一個二級索引,所以葉子節點下面掛的是這一行的主鍵id 。 所以當我們查詢返回的數據在 id profession age status 之中,則直接走二級索引直接返回數據了。 如果超出這個范圍,就需要拿到主鍵id,再去掃描聚集索引,再獲取額外的數據 了,這個過程就是回表。 而我們如果一直使用 select * 查詢返回所有字段值,很容易就會造成回表 查詢(除非是根據主鍵查詢,此時只會掃描聚集索引)。
為了大家更清楚的理解,什么是覆蓋索引,什么是回表查詢,我們一起再來看下面的這組 SQL 的執行過程。
A. 表結構及索引示意圖 :

?id是主鍵,是一個聚集索引。 name字段建立了普通索引,是一個二級索引(輔助索引)。

?B. 執行SQL : select * from tb_user where id = 2;

?根據id查詢,直接走聚集索引查詢,一次索引掃描,直接返回數據,性能高。

C. 執行SQLselet id,name from tb_user where name = 'Arm';

雖然是根據 name 字段查詢,查詢二級索引,但是由于查詢返回在字段為 id name ,在 name 的二級索引中,這兩個值都是可以直接獲取到的,因為覆蓋索引,所以不需要回表查詢,性能高。

?D. 執行SQLselet id,name,gender from tb_user where name = 'Arm';

?

由于在 name 的二級索引中,不包含 gender ,所以,需要兩次索引掃描,也就是需要回表查詢,性能相對較差一點。
思考題:
一張表 , 有四個字段 (id, username, password, status), 由于數據量大 , 需要對以下SQL 語句進行優化 , 該如何進行才是最優方案 :
select id,username,password from tb_user where username = 'itcast';

答案: 針對于 username, password建立聯合索引, sql為:

create index idx_user_name_pass on tb_user(username,password);
這樣可以避免上述的 SQL 語句,在查詢的過程中,出現回表查詢。

?6.7前綴索引

當字段類型為字符串( varchar text longtext 等)時,有時候需要索引很長的字符串,這會讓索引變得很大,查詢時,浪費大量的磁盤IO , 影響查詢效率。此時可以只將字符串的一部分前綴,建立索引,這樣可以大大節約索引空間,從而提高索引效率。

  1. 語法
    create index idx_xxxx on table_name(column(n)) ;
    示例 :
    ?
    tb_user 表的 email 字段,建立長度為5的前綴索引。
    create index idx_email_5 on tb_user(email(5));

    ?
  2. 前綴長度
    ?
    可以根據索引的選擇性來決定,而選擇性是指不重復的索引值(基數)和數據表的記錄總數的比值,索引選擇性越高則查詢效率越高,唯一索引的選擇性是1 ,這是最好的索引選擇性,性能是最好的。
    ?
    select count(distinct email) / count(*) from tb_user ;
    select count(distinct substring(email,1,5)) / count(*) from tb_user ;

    貼士: 求取不重復的值, 在字段前加上distinct關鍵字來去重

  3. 前綴索引的查詢流程

    ?

?6.8單列索引與聯合索引

單列索引:即一個索引只包含單個列。
?
聯合索引:即一個索引包含了多個列。
我們先來看看 tb_user 表中目前的索引情況:
?

?在查詢出來的索引中,既有單列索引,又有聯合索引

接下來,我們來執行一條SQL語句,看看其執行計劃:

通過上述執行計劃我們可以看出來,在 and 連接的兩個字段 phone name 上都是有單列索引的,但是最終mysql 只會選擇一個索引,也就是說,只能走一個字段的索引,此時是會回表查詢的。

緊接著,我們再來創建一個 phone name 字段的聯合索引來查詢一下執行計劃。

create unique index idx_user_phone_name on tb_user(phone,name);

此時,查詢時,就走了聯合索引,而在聯合索引中包含 phone name 的信息,在葉子節點下掛的是對應的主鍵id ,所以查詢是無需回表查詢的。

在業務場景中,如果存在多個查詢條件,考慮針對于查詢字段建立索引時,建議建立聯合索引,而非單列索引。

?如果查詢使用的是聯合索引,具體的結構示意圖如下:

?

?7索引設計原則

  1. 針對于數據量較大,且查詢比較頻繁的表建立索引。
    ?
  2. 針對于常作為查詢條件(where)、排序(order by)、分組(group by)操作的字段建立索引。
    ?
  3. 盡量選擇區分度高的列作為索引,盡量建立唯一索引,區分度越高,使用索引的效率越高。
    ?
  4. 如果是字符串類型的字段,字段的長度較長,可以針對于字段的特點,建立前綴索引。
    ?
  5. 盡量使用聯合索引,減少單列索引,查詢時,聯合索引很多時候可以覆蓋索引,節省存儲空間,避免回表,提高查詢效率。
    ?
  6. 要控制索引的數量,索引并不是多多益善,索引越多,維護索引結構的代價也就越大,會影響增刪改的效率。

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

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

相關文章

微服務常用日志追蹤方案:Sleuth + Zipkin + ELK

在微服務架構中&#xff0c;一個用戶請求往往需要經過多個服務的協同處理。為了有效追蹤請求的完整調用鏈路&#xff0c;需要一套完整的日志追蹤方案。Sleuth Zipkin ELK 組合提供了完整的解決方案 Sleuth&#xff1a;生成和傳播追蹤IDZipkin&#xff1a;收集、存儲和可視化…

R語言基礎| 創建數據集

在R語言中&#xff0c;有多種數據類型&#xff0c;用以存儲和處理數據。每種數據類型都有其特定的用途和操作函數&#xff0c;使得R語言在處理各種數據分析任務時非常靈活和強大&#xff1a; 向量&#xff08;Vector&#xff09;: 向量是R語言中最基本的數據類型&#xff0c;它…

nssctf第二題[SWPUCTF 2021 新生賽]簡簡單單的邏輯

這是題目&#xff0c;下載后得到一個python文件,打開 解讀代碼&#xff1a; for i in range(len(list)):key (list[i]>>4)((list[i] & 0xf)<<4)result str(hex(ord(flag[i])^key))[2:].zfill(2)list[i]>>4&#xff1a;從列表中取數字同時高4位向右位…

mysql(十五)

目錄 子查詢 1.準備工作 2--創建表格 3--插入數據 2.where 子查詢單列單個數據 格式 查詢 3.where 子查詢單列多個數據(in) 格式 查詢 使用子查詢 4.from 多行多數據 格式 查詢 子查詢 將select的查詢的返回結果 當成另外一個selet語句的內容去使用。 子查詢放在()里面 注意…

【HarmonyOS 5】鴻蒙Taro跨端框架

?Taro跨端框架? 支持React語法開發鴻蒙應用&#xff0c;架構分為三層&#xff1a; ArkVM層運行業務代碼和React核心TaroElement樹處理節點創建和屬性綁定TaroRenderNode虛擬節點樹與上屏節點一一對應 import { Component } from tarojs/taro export default class MyCompon…

華為OD機試真題——會議接待 /代表團坐車(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C++、C語言、GO六種語言的最佳實現方式! 本文收錄于專欄:《2025華為OD真題目錄+全流程解析/備考攻略/經驗分享》 華為OD機試真題《會議…

C語言---動態內存管理、柔性數組

一、malloc和free 1、變長數組 變長數組是指數組的大小可以通過變量來指定。 在c99以及之后的標準中&#xff1a; #include<stdio.h> int main() { int n0; scanf("%d",&n); } 2、malloc和free 這個函數向內存申請一塊連續可用的空間&#xff0c;并返…

WEBSTORM前端 —— 第3章:移動 Web —— 第4節:移動適配-VM

目錄 一、適配方案 二、VM布局 ?編輯 三、vh布局 四、案例—酷我音樂 一、適配方案 二、VM布局 三、vh布局 四、案例—酷我音樂

Dynamics 365 Business Central AI Sales Order Agent Copilot

#AI Copilot# #D365 BC 26 Wave# 最近很多客戶都陸續升級到 Dynamics 365 Business Central 26 wave, Microsoft 提供一個基于Copilot 的Sales Order Agent&#xff0c;此文將此功能做個介紹. Explorer: 可以看到26版本上面增加了這樣一個新圖標。 Configuration: 配置過程…

【harbor】--配置https

使用自建的 CA 證書來自簽署和啟用 HTTPS 通信。 &#xff08;1&#xff09;生成 CA認證 使用 OpenSSL 生成一個 2048位的私鑰這是 自建 CA&#xff08;證書頒發機構&#xff09; 的私鑰&#xff0c;后續會用它來簽發證書。 # 1創建CA認證 cd 到harbor [rootlocalhost harbo…

Selenium基礎操作方法詳解

Selenium基礎操作方法詳解&#xff1a;從零開始編寫自動化腳本&#xff08;附完整代碼&#xff09; 引言 Selenium是自動化測試和網頁操作的利器&#xff0c;但對于新手來說&#xff0c;掌握基礎操作是成功的第一步。本文將手把手教你使用Selenium完成瀏覽器初始化、元素定位、…

python同步mysql數據

python寫了一個簡單的mysql數據同步腳本,只作為學習練習,大佬勿噴 # -*- coding: utf-8 -*- """ Time:2025/5/29 14:38 Auth:HEhandsome """ import pymysql from pymysql import Connectclass Mysql:def __init__(self):#源數據庫self.sou_hos…

手撕Java+硅基流動實現MCP服務器教程

手撕Java硅基流動實現MCP服務器教程 一、MCP協議核心概念 MCP是什么 MCP 是 Anthropic (Claude) 主導發布的一個開放的、通用的、有共識的協議標準。 ● MCP 是一個標準協議&#xff0c;就像給 AI 大模型裝了一個 “萬能接口”&#xff0c;讓 AI 模型能夠與不同的數據源和工…

.net consul服務注冊與發現

.NET中Consul服務注冊與發現的技術實踐 在微服務架構中&#xff0c;服務的注冊與發現是至關重要的環節&#xff0c;它能幫助各個服務之間實現高效的通信和協作。Consul作為一款功能強大的工具&#xff0c;為我們提供了優秀的服務注冊與發現解決方案。今天&#xff0c;我們就來…

大數據量下的數據修復與回寫Spark on Hive 的大數據量主鍵沖突排查:COUNT(DISTINCT) 的陷阱

背景與問題概述 這一周&#xff08;2025-05-26-2026-05-30&#xff09;我在搞數據擬合修復優化的任務&#xff0c;有大量的數據需要進行數據處理及回寫&#xff0c;大概一個表一天一分區有五六千萬數據&#xff0c;大約一百多列的字段。 具體是這樣的我先取檔案&#x…

基于 AUTOSAR 的域控產品軟件開發:從 CP 到 AP 的跨越

基于 AUTOSAR 的域控產品軟件開發&#xff1a;從 CP 到 AP 的跨越 一、AUTOSAR AP 架構解析&#xff1a;面向智能汽車的自適應框架 &#xff08;一&#xff09;引言 隨著汽車智能化向 L3 演進&#xff0c;傳統 AUTOSAR CP&#xff08;經典平臺&#xff09;在實時性、動態性和…

Nacos 配置管理案例:nacos-spring-cloud-config-example詳解

一、結構說明&#xff1a;基于Spring Cloud Alibaba的微服務示例 nacos-spring-cloud-config-example : 服務提供者 二、技術棧&#xff1a;Spring BootSpring CloudSpring Cloud Alibaba Nacos Actuator&#xff08;可選&#xff1a;監控&#xff09; 三、使用環境 安裝…

BUUCTF[ACTF2020 新生賽]Include 1題解

BUUCTF[ACTF2020 新生賽]Include 1題解 題目分析&#xff1a;知識準備&#xff1a;php://filter 過濾器參數說明常用過濾器功能對照表 開始解題&#xff1a;原理解析構造payload 總結 題目分析&#xff1a; 生成靶機&#xff0c;打開網址&#xff0c;查看源碼&#xff0c;抓包…

vscode + cmake + ninja+ gcc 搭建MCU開發環境

vscode cmake ninja gcc 搭建MCU開發環境 文章目錄 vscode cmake ninja gcc 搭建MCU開發環境1. 前言2. 工具安裝及介紹2.1 gcc2.1.1 gcc 介紹2.1.2 gcc 下載及安裝 2.2 ninja2.2.1 ninja 介紹2.2 ninja 安裝 2.3 cmake2.3.1 cmake 介紹2.3.2 cmake 安裝 2.4 VScode 3. 上手…

九(1). 引用作為函數參數的使用

引用作為參數使用 在 C 中&#xff0c;引用作為函數參數是一種高效且靈活的參數傳遞方式&#xff0c;它避免了拷貝開銷&#xff0c;同時允許函數直接操作原始數據。 以下是關于引用作為參數的詳細使用指南和最佳實踐&#xff1a; 1. 引用作為參數的基本用法 (1) 普通引用&…