mysql的InnoDB索引總結

MySQL InnoDB索引知識點總結

1. 索引類型

1.1 聚簇索引(Clustered Index)

定義與特性
  • 定義:聚簇索引是InnoDB的默認存儲方式,數據行按照主鍵的順序物理存儲在磁盤上
  • 特性
    • 每個InnoDB表只能有一個聚簇索引
    • 數據頁中的記錄按主鍵值的順序存放
    • 葉子節點直接存儲完整的數據行
    • 查詢主鍵時可以直接定位到數據,無需額外的回表操作
數據與索引存儲方式
  • 數據頁和索引頁是一體的,存儲在同一個B+樹結構中
  • 非葉子節點存儲主鍵值和指向子節點的指針
  • 葉子節點存儲主鍵值和完整的數據行記錄
  • 葉子節點通過雙向鏈表連接,方便范圍查詢
主鍵選擇對聚簇索引的影響
  • 自增主鍵
    • 新記錄總是插入到末尾,減少頁分裂
    • 順序插入,提高寫入性能
    • 主鍵值較小,節省存儲空間
  • 非自增主鍵
    • 可能導致頻繁的頁分裂和頁合并
    • 降低插入性能,產生碎片
  • 無主鍵時:InnoDB會自動創建一個6字節的隱藏主鍵(ROW_ID)

1.2 二級索引(Secondary Index)

定義與結構
  • 定義:除聚簇索引外的所有其他索引都稱為二級索引(也叫非聚簇索引)
  • 結構特點
    • 索引鍵值 + 主鍵值的組合
    • 葉子節點不存儲完整數據行,只存儲索引列值和主鍵值
    • 可以有多個二級索引
葉節點存儲主鍵值的機制
  • 二級索引的葉子節點存儲:索引列值 + 主鍵值
  • 這種設計避免了主鍵變更時需要更新所有二級索引
  • 當聚簇索引頁分裂時,二級索引不需要更新
  • 主鍵值作為"書簽"指向聚簇索引中的具體記錄
回表查詢(書簽查找)過程
  1. 首先在二級索引B+樹中查找索引鍵值
  2. 獲得對應的主鍵值
  3. 使用主鍵值在聚簇索引中進行二次查找
  4. 最終在聚簇索引的葉子節點獲得完整記錄
-- 示例:使用二級索引查詢
SELECT * FROM users WHERE email = 'user@example.com';
-- 1. 在email索引中查找 'user@example.com'
-- 2. 獲得主鍵值,如 id=123
-- 3. 在聚簇索引中查找 id=123
-- 4. 返回完整記錄

1.3 復合索引(Composite Index)

多列組合索引規則
  • 復合索引由多個列組成,如 INDEX(col1, col2, col3)
  • 索引按照列的定義順序進行排序
  • 先按第一列排序,第一列相同時按第二列排序,以此類推
最左前綴匹配原則
  • 原則:查詢必須從索引的最左列開始,并且不能跳過中間的列
  • 有效使用場景
    INDEX(a, b, c)
    -- 可以使用索引:
    WHERE a = 1
    WHERE a = 1 AND b = 2
    WHERE a = 1 AND b = 2 AND c = 3
    WHERE a = 1 AND c = 3  -- 只能使用a列的索引-- 無法使用索引:
    WHERE b = 2
    WHERE c = 3
    WHERE b = 2 AND c = 3
    
索引選擇性與列順序優化
  • 選擇性高的列放在前面:選擇性 = 不重復值數量 / 總記錄數
  • 考慮查詢頻率:經常用于WHERE條件的列放在前面
  • 考慮排序需求:如果需要排序,將排序列放在索引中合適位置

1.4 其他特殊索引類型

覆蓋索引(Covering Index)
  • 定義:索引包含查詢所需的所有列,無需回表查詢
  • 優勢
    • 避免回表操作,減少I/O
    • 提高查詢性能
    • 減少鎖競爭
  • 示例
    -- 創建覆蓋索引
    CREATE INDEX idx_user_info ON users(status, age, name);-- 下面的查詢可以使用覆蓋索引
    SELECT name FROM users WHERE status = 1 AND age > 18;
    
前綴索引(Prefix Index)
  • 定義:只索引列值的前幾個字符
  • 適用場景:VARCHAR、TEXT等長字符串列
  • 優勢:節省存儲空間,提高索引效率
  • 劣勢:可能降低索引選擇性
  • 示例
    -- 為email列的前10個字符創建索引
    CREATE INDEX idx_email_prefix ON users(email(10));
    
全文索引(Full-Text Index)
  • 定義:用于全文搜索的特殊索引類型
  • 支持的存儲引擎:InnoDB(MySQL 5.6+)、MyISAM
  • 適用場景:文本搜索、關鍵詞匹配
  • 示例
    -- 創建全文索引
    CREATE FULLTEXT INDEX idx_content ON articles(title, content);-- 使用全文索引搜索
    SELECT * FROM articles WHERE MATCH(title, content) AGAINST('MySQL 索引');
    

2. 索引數據結構

2.1 為什么MySQL選擇B+樹作為索引結構

數據庫索引的特殊需求

在分析為什么選擇B+樹之前,我們需要了解數據庫索引的特殊需求:

  • 大量數據存儲:數據庫通常需要處理TB級別的數據
  • 磁盤I/O優化:數據主要存儲在磁盤上,磁盤I/O是性能瓶頸
  • 范圍查詢頻繁:數據庫經常需要進行范圍查詢和排序
  • 并發訪問:多個事務同時訪問數據
  • 持久化存儲:數據需要可靠地存儲在磁盤上
B+樹 vs 其他數據結構詳細對比
與平衡二叉樹(AVL樹/紅黑樹)的對比
對比維度B+樹平衡二叉樹
樹的高度矮胖型,高度通常3-4層高瘦型,高度log?n
磁盤I/O次數少(每層一次I/O)多(可能需要很多次I/O)
節點大小大(通常4KB-16KB)小(只存儲一個鍵值)
磁盤利用率高(一次讀取多個鍵值)低(一次只讀取一個鍵值)
范圍查詢高效(葉子節點鏈表)低效(需要中序遍歷)
內存友好性好(符合磁盤頁面大小)差(隨機訪問模式)

具體分析

假設有100萬條記錄:
- 平衡二叉樹:高度約為log?(1000000) ≈ 20層最壞情況需要20次磁盤I/O才能找到數據- B+樹(假設每個節點1000個鍵值):高度約為log????(1000000) ≈ 2層最多只需要3次磁盤I/O(根節點+內部節點+葉子節點)
與B樹的對比
對比維度B+樹B樹
數據存儲位置只在葉子節點存儲數據所有節點都存儲數據
內部節點容量更多鍵值(不存儲數據)較少鍵值(需要存儲數據)
范圍查詢效率高(葉子節點鏈表遍歷)低(需要回溯到公共祖先)
查詢穩定性穩定(都要到葉子節點)不穩定(可能在任意層結束)
緩存友好性好(內部節點更緊湊)相對較差

B+樹優勢示例

-- 范圍查詢:SELECT * FROM users WHERE age BETWEEN 20 AND 30;B+樹執行過程:
1. 從根節點找到age=20的葉子節點
2. 從該葉子節點開始,沿著鏈表順序掃描到age=30
3. 整個過程只需要很少的磁盤I/OB樹執行過程:
1. 找到age=20的位置(可能在任意層)
2. 進行復雜的樹遍歷,需要反復回溯
3. 無法充分利用磁盤的順序讀特性
與哈希表的對比
對比維度B+樹哈希表
等值查詢O(log n)O(1)
范圍查詢支持且高效不支持
排序輸出天然有序無序
模糊查詢支持(前綴匹配)不支持
磁盤存儲友好(順序存儲)困難(隨機分布)
沖突處理不存在沖突需要處理哈希沖突
內存占用相對較少可能較多(負載因子)
與跳表的對比
對比維度B+樹跳表
實現復雜度復雜(但已成熟)相對簡單
空間效率中等(索引層開銷)
并發控制成熟的鎖機制實現復雜
磁盤友好性非常好一般
范圍查詢高效高效
B+樹在數據庫中的具體優勢
1. 磁盤I/O優化
磁盤特性:
- 順序讀寫速度:100-200 MB/s
- 隨機讀寫速度:1-5 MB/s
- 磁盤頁面大小:通常4KB或8KBB+樹優勢:
- 節點大小匹配磁盤頁面
- 葉子節點鏈表支持順序讀取
- 減少隨機I/O,提高緩存命中率
2. 內存緩存效率
InnoDB Buffer Pool機制:
- 將熱點數據頁緩存在內存中
- B+樹的內部節點更容易被緩存
- 大部分查詢只需要訪問已緩存的根節點和少數內部節點
3. 范圍查詢優化
-- 高效的范圍查詢實現
SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-01-31';執行過程:
1. 定位到'2024-01-01'對應的葉子節點
2. 沿著葉子節點鏈表順序掃描
3. 直到找到'2024-01-31'為止
4. 整個過程主要是順序I/O操作
4. 并發控制友好
B+樹的并發優勢:
- 讀操作通常不需要鎖定整個樹
- 可以實現細粒度的鎖控制
- 支持多版本并發控制(MVCC)
- 頁面級別的鎖定機制
實際性能數據對比

假設一個包含1000萬條記錄的表:

數據結構查找操作范圍查詢插入操作內存占用
B+樹3-4次I/O高效較好適中
平衡二叉樹20+次I/O較差較少
B樹3-4次I/O中等較好適中
哈希表1次I/O不支持較多
為什么不選擇其他結構的總結
  1. 平衡二叉樹

    • 樹太高,導致過多的磁盤I/O
    • 不適合磁盤存儲的特性
    • 范圍查詢效率低
  2. 哈希表

    • 不支持范圍查詢和排序
    • 難以在磁盤上高效實現
    • 不支持模糊匹配
  3. B樹

    • 范圍查詢效率不如B+樹
    • 內部節點存儲數據降低了扇出度
    • 查詢性能不夠穩定
  4. 跳表

    • 在磁盤上的實現不夠高效
    • 空間開銷相對較大
    • 并發控制復雜
B+樹的設計哲學

B+樹的設計完美契合了數據庫存儲的需求:

  • 面向磁盤優化:最小化磁盤I/O次數
  • 支持多種查詢:等值查詢、范圍查詢、排序
  • 高并發友好:支持細粒度鎖控制
  • 空間效率高:緊湊的存儲結構
  • 實現成熟:經過數十年的優化和驗證

2.2 B+樹索引結構

非葉子節點與葉子節點的區別
  • 非葉子節點(內部節點)

    • 只存儲鍵值和指向子節點的指針
    • 不存儲實際數據
    • 用于導航和定位
    • 鍵值是子節點中的最大值或最小值
  • 葉子節點

    • 存儲實際的數據記錄(聚簇索引)或主鍵值(二級索引)
    • 所有葉子節點在同一層級
    • 包含所有的索引鍵值
葉子節點的雙向鏈表特性
  • 所有葉子節點通過指針連接形成雙向鏈表
  • 支持高效的范圍查詢和排序操作
  • 便于順序掃描和反向掃描
  • 提高了區間查詢的性能
[葉子節點1] ←→ [葉子節點2] ←→ [葉子節點3] ←→ [葉子節點4]
平衡樹結構與查詢效率
  • 平衡性:所有葉子節點都在同一層,保證查詢路徑長度一致
  • 查詢復雜度:O(log n),其中n是記錄數
  • 樹的高度:通常3-4層就能存儲數百萬記錄
  • 頁分裂與合并:自動維護樹的平衡性

2.3 B+樹與其他結構對比(簡化版)

這里提供一個簡化的對比表格,詳細的對比分析請參考上面的"為什么MySQL選擇B+樹作為索引結構"章節。

與B樹的差異
特性B+樹B樹
數據存儲位置只在葉子節點所有節點都可以存儲數據
葉子節點連接雙向鏈表連接葉子節點獨立
范圍查詢效率高(鏈表遍歷)低(需要回溯)
磁盤I/O更少(非葉子節點更緊湊)相對較多
查詢穩定性穩定(都到葉子節點)不穩定(可能在任意層找到)
與哈希索引的適用場景
比較維度B+樹索引哈希索引
等值查詢O(log n)O(1)
范圍查詢支持不支持
排序支持不支持
部分匹配支持(最左前綴)不支持
存儲引擎InnoDB、MyISAMMemory
適用場景通用場景等值查詢為主的場景

3. InnoDB索引特殊特性

3.1 自適應哈希索引(Adaptive Hash Index)

自動創建與維護機制
  • 自動檢測:InnoDB監控二級索引的使用模式
  • 創建條件
    • 對某個索引頁的訪問模式穩定
    • 以相同方式訪問了至少100次
    • 頁面通過該模式訪問了至少N次(N基于頁面大小和訪問模式)
  • 維護機制
    • 自動維護,無需人工干預
    • 當訪問模式改變時自動刪除
    • 內存中的哈希表結構
使用場景與限制
  • 適用場景

    • 大量等值查詢
    • 查詢模式相對穩定
    • 工作集能夠放入內存
  • 限制

    • 只支持等值查詢,不支持范圍查詢
    • 只能針對整個索引鍵,不支持部分索引鍵
    • 無法顯式創建或刪除
    • 可能與某些鎖操作沖突
-- 查看自適應哈希索引狀態
SHOW ENGINE INNODB STATUS;
-- 或
SELECT * FROM INFORMATION_SCHEMA.INNODB_METRICS 
WHERE NAME LIKE '%adaptive_hash%';

3.2 索引組織表(Index-Organized Table)

數據按主鍵順序存儲
  • InnoDB表本質上就是索引組織表
  • 數據行按照主鍵順序物理存儲
  • 表數據就是聚簇索引的葉子節點
  • 沒有獨立的數據文件,數據存儲在索引結構中
與堆組織表的區別
特性索引組織表(InnoDB)堆組織表(MyISAM)
數據存儲按主鍵順序存儲按插入順序存儲
主鍵查詢直接定位需要額外索引查找
插入性能可能有頁分裂通常較快
范圍查詢高效(數據有序)需要額外排序
存儲空間可能有碎片相對緊湊

3.3 事務與索引一致性

MVCC對索引查詢的影響
  • 版本可見性:索引查詢需要結合MVCC判斷記錄版本的可見性
  • 刪除標記:刪除的記錄在索引中標記為刪除,但不立即物理刪除
  • 回滾段:通過undo log維護數據的歷史版本
  • Read View:事務開始時建立一致性視圖,確保讀取數據的一致性
鎖機制與索引并發控制
  • 記錄鎖(Record Lock):鎖定索引記錄
  • 間隙鎖(Gap Lock):鎖定索引記錄之間的間隙
  • Next-Key Lock:記錄鎖 + 間隙鎖,防止幻讀
  • 插入意向鎖:插入前獲取的特殊間隙鎖
-- 示例:Next-Key Lock的作用
-- 事務1
BEGIN;
SELECT * FROM users WHERE age BETWEEN 20 AND 30 FOR UPDATE;-- 事務2(會被阻塞)
INSERT INTO users (name, age) VALUES ('Tom', 25);

4. 索引維護與優化

4.1 索引維護操作

頁分裂(Page Split)與頁合并(Page Merge)
  • 頁分裂發生時機

    • 插入新記錄時頁面空間不足
    • 更新操作導致記錄長度增加
  • 頁分裂過程

    1. 創建新頁面
    2. 將部分記錄移動到新頁面
    3. 更新父節點的指針
    4. 調整頁面間的鏈接關系
  • 頁合并發生時機

    • 刪除記錄后頁面利用率過低
    • 頁面利用率低于MERGE_THRESHOLD(默認50%)
  • 影響

    • 頁分裂增加I/O開銷,降低性能
    • 頁合并有助于回收空間,但也有開銷
索引碎片產生與整理
  • 碎片產生原因

    • 頻繁的插入、刪除、更新操作
    • 頁分裂導致的邏輯順序與物理順序不一致
    • 刪除記錄后留下的空隙
  • 碎片類型

    • 內部碎片:頁面內的未使用空間
    • 外部碎片:頁面之間的不連續性
  • 整理方法

    -- 重建表(會重建所有索引)
    ALTER TABLE table_name ENGINE=InnoDB;-- 優化表
    OPTIMIZE TABLE table_name;-- 重建特定索引
    ALTER TABLE table_name DROP INDEX idx_name, ADD INDEX idx_name(col1, col2);
    

4.2 索引設計最佳實踐

主鍵選擇策略(自增ID vs 業務主鍵)
  • 自增ID主鍵

    • 優勢:順序插入,減少頁分裂,性能穩定
    • 劣勢:額外存儲開銷,可能泄露業務信息
    • 適用:大多數OLTP應用
  • 業務主鍵

    • 優勢:有業務含義,減少關聯查詢
    • 劣勢:可能導致隨機插入,性能不穩定
    • 適用:主鍵具有明確業務含義且插入模式可控
  • 聯合主鍵

    • 優勢:符合業務模型
    • 劣勢:鍵值較大,影響二級索引性能
    • 適用:關系表、日志表
合理控制索引數量
  • 原則

    • 優先創建高選擇性的索引
    • 避免創建冗余索引
    • 考慮查詢頻率和重要性
    • 平衡查詢性能和維護成本
  • 索引數量建議

    • 單表索引數量一般不超過6個
    • 復合索引列數不超過3-4個
    • 監控索引使用情況,刪除無用索引
避免過度索引與冗余索引
  • 過度索引問題

    • 增加存儲空間
    • 降低寫入性能
    • 增加維護成本
  • 冗余索引識別

    -- 查找冗余索引
    SELECT table_schema,table_name,redundant_index_name,redundant_index_columns,dominant_index_name,dominant_index_columns
    FROM sys.schema_redundant_indexes;
    
  • 索引合并策略

    • 將多個單列索引合并為復合索引
    • 考慮最左前綴原則
    • 根據查詢模式調整列順序

4.3 索引使用分析

EXPLAIN執行計劃解讀
EXPLAIN SELECT * FROM users WHERE status = 1 AND age > 25;

關鍵字段解讀:

  • type:連接類型,性能從好到壞:

    • const:主鍵或唯一索引等值查詢
    • eq_ref:唯一索引查找
    • ref:非唯一索引等值查詢
    • range:索引范圍查詢
    • index:索引全掃描
    • ALL:全表掃描
  • key:實際使用的索引

  • key_len:使用的索引長度

  • rows:預估掃描行數

  • Extra:額外信息

    • Using index:覆蓋索引
    • Using filesort:需要額外排序
    • Using temporary:使用臨時表
索引失效場景與避免方法
  • 常見失效場景
    1. 在索引列上使用函數

      -- 錯誤:索引失效
      SELECT * FROM users WHERE UPPER(name) = 'JOHN';-- 正確:索引有效
      SELECT * FROM users WHERE name = 'JOHN';
      
    2. 類型轉換

      -- 錯誤:字符串列與數字比較
      SELECT * FROM users WHERE phone = 13800138000;-- 正確:類型匹配
      SELECT * FROM users WHERE phone = '13800138000';
      
    3. LIKE以通配符開頭

      -- 錯誤:索引失效
      SELECT * FROM users WHERE name LIKE '%john%';-- 正確:可以使用索引
      SELECT * FROM users WHERE name LIKE 'john%';
      
    4. OR條件中有非索引列

      -- 如果age沒有索引,整個查詢不能使用索引
      SELECT * FROM users WHERE name = 'john' OR age = 25;-- 使用UNION改寫
      SELECT * FROM users WHERE name = 'john'
      UNION
      SELECT * FROM users WHERE age = 25;
      
    5. 復合索引不遵循最左前綴

      -- 索引:INDEX(a, b, c)
      -- 錯誤:跳過了a列
      SELECT * FROM table WHERE b = 1 AND c = 2;-- 正確:從最左列開始
      SELECT * FROM table WHERE a = 1 AND b = 1;
      

5. InnoDB與MyISAM索引對比

5.1 存儲結構差異

特性InnoDBMyISAM
索引文件數據和索引存儲在.ibd文件中索引存儲在.MYI文件,數據存儲在.MYD文件
聚簇索引支持聚簇索引,數據按主鍵順序存儲不支持聚簇索引,使用堆組織表
二級索引葉子節點存儲主鍵值葉子節點存儲行指針(文件偏移量)
主鍵要求必須有主鍵(顯式或隱式)主鍵可選

5.2 事務支持與崩潰恢復

特性InnoDBMyISAM
事務支持完全支持ACID事務不支持事務
崩潰恢復通過redo log和undo log自動恢復需要手動修復,可能丟失數據
數據完整性通過事務保證一致性依賴應用程序保證
回滾能力支持事務回滾不支持回滾

5.3 并發控制機制

特性InnoDBMyISAM
鎖粒度行級鎖表級鎖
讀寫并發高并發讀寫讀寫互斥
MVCC支持多版本并發控制不支持
死鎖檢測自動死鎖檢測和回滾不適用
鎖等待支持鎖等待超時簡單的鎖等待

5.4 性能表現對比(讀/寫操作、內存占用)

讀操作性能
  • InnoDB

    • 主鍵查詢:非常快(聚簇索引)
    • 二級索引查詢:可能需要回表,相對較慢
    • 范圍查詢:利用B+樹鏈表結構,性能較好
    • 并發讀:通過MVCC支持高并發
  • MyISAM

    • 所有查詢都需要通過索引定位到數據文件
    • 沒有回表概念,但需要額外的I/O讀取數據
    • 范圍查詢性能一般
    • 并發讀性能好,但與寫操作互斥
寫操作性能
  • InnoDB

    • 插入:如果是順序插入(自增主鍵),性能很好
    • 隨機插入:可能導致頁分裂,性能相對較差
    • 更新:支持事務,有額外的日志開銷
    • 刪除:邏輯刪除,定期清理
  • MyISAM

    • 插入:通常在表尾插入,性能較好
    • 更新:表級鎖,并發性能差
    • 刪除:物理刪除,但會產生碎片
內存占用
  • InnoDB

    • 使用緩沖池(Buffer Pool)緩存數據頁和索引頁
    • 內存占用相對較高,但緩存效果好
    • 自動管理內存,LRU算法淘汰頁面
  • MyISAM

    • 只緩存索引,數據依賴操作系統緩存
    • 內存占用相對較低
    • 索引緩存大小由key_buffer_size控制
適用場景總結
  • 選擇InnoDB的場景

    • 需要事務支持的應用
    • 高并發讀寫應用
    • 對數據一致性要求高
    • 需要崩潰恢復能力
    • 現代Web應用(推薦)
  • 選擇MyISAM的場景

    • 以讀為主的應用
    • 不需要事務支持
    • 對查詢性能要求極高
    • 數據倉庫、日志系統
    • 注意:MySQL 8.0默認存儲引擎是InnoDB,MyISAM已不推薦使用

總結

InnoDB的索引系統是一個復雜而精妙的設計,其B+樹結構、聚簇索引、以及各種優化機制使得它能夠在保證事務ACID特性的同時,提供出色的查詢性能。理解這些索引原理和最佳實踐,對于數據庫設計和性能優化具有重要意義。

在實際應用中,應該根據具體的業務場景選擇合適的索引策略,平衡查詢性能和維護成本,并通過持續的監控和優化來確保數據庫的穩定運行。

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

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

相關文章

C++模板的補充

類模板(上一篇沒講到類模板C/C內存管理&函數模板-CSDN博客&#xff09; 類模板的定義&#xff1a; template<class T1, class T2, ..., class Tn> class 類模板名 {// 類內成員定義 }; 用一個簡單的棧例子講類模板 #define _CRT_SECURE_NO_WARNINGS #include &l…

用JOIN替代子查詢的查詢性能優化

一、子查詢的性能瓶頸分析?重復執行成本?關聯子查詢會導致外層每行數據觸發一次子查詢&#xff0c;時間復雜度為O(M*N)sql-- 典型低效案例 SELECT e.employee_id, (SELECT d.department_name FROM departments d WHERE d.department_id e.department_id) FROM employees e; …

【設計模式】訪問者模式模式

訪問者模式&#xff08;Visitor Pattern&#xff09;詳解一、訪問者模式簡介 訪問者模式&#xff08;Visitor Pattern&#xff09; 是一種 行為型設計模式&#xff08;對象行為型模式&#xff09;&#xff0c;它允許你在不修改對象結構的前提下&#xff0c;為對象結構中的元素添…

比特幣現貨和比特幣合約的區別與聯系

一、基本定義項目現貨&#xff08;Spot&#xff09;合約&#xff08;Futures / Perpetual&#xff09;本質直接買賣比特幣本身買賣比特幣價格的衍生品合約所得資產真實的 BTC合約頭寸&#xff08;沒有直接持有 BTC&#xff09;結算方式交割比特幣現金結算&#xff08;多數平臺&…

Qt/C++開發監控GB28181系統/實時監測設備在線離線/視頻預覽自動重連/重新點播取流/低延遲

一、前言說明 一個好的視頻監控系統&#xff0c;設備掉線后能夠自動重連&#xff0c;也是一個重要的功能指標&#xff0c;如果監控系統只是個rtsp流地址&#xff0c;那非常好辦&#xff0c;只需要重新打開流地址即可&#xff0c;而gb28181中就變得復雜了很多&#xff0c;需要多…

此芯p1開發板使用OpenHarmony時llama.cpp不同優化速度對比(GPU vs CPU)

硬件環境 Cix P1 SoC 瑞莎星睿 O6 開發板 rx580顯卡 產品介紹&#xff1a; https://docs.radxa.com/orion/o6/getting-started/introduction OpenHarmony 5.0.0 使用vulkan后端的llama.cpp &#xff08;GPU&#xff09; # ./llama-bench -m /data/qwen1_5-0_5b-chat-q2_k.…

Android 四大布局:使用方式與性能優化原理

一、四大布局基本用法與特點1. LinearLayout&#xff08;線性布局&#xff09;使用方式&#xff1a;<LinearLayoutandroid:orientation"vertical" <!-- 排列方向&#xff1a;vertical/horizontal -->android:layout_width"match_parent"android:…

Redis的BigKey問題

Redis的BigKey問題 什么是大Key問題&#xff1f; 大key問題其實可以說是大value問題&#xff0c;就是某個key對應的value所占據的存儲空間太大了&#xff0c;所以導致我們在操作這個key的時候花費的時間過長&#xff08;序列化\反序列化&#xff09;&#xff0c;從而降低了redi…

TDengine IDMP 產品基本概念

基本概念 元素 (Element) IDMP 通過樹狀層次結構來組織數據&#xff0c;樹狀結構里的每個節點被稱之為元素 (Element)。元素是一個物理的或邏輯的實體。它可以是具體的物理設備&#xff08;比如一臺汽車&#xff09;&#xff0c;物理設備的一個子系統&#xff08;比如一臺汽車的…

專題二_滑動窗口_將x減到0的最小操作數

一&#xff1a;題目解釋&#xff1a;每次只能移除數組的邊界&#xff0c;移除的邊界的總和為x&#xff0c;要求返回你移除邊界的最小操作數&#xff01;也就是說你最少花幾次移除邊界&#xff0c;就能夠讓這些移除的邊界的和為x&#xff0c;則返回這個次數&#xff01;所以這個…

CentOS 7 下通過 Anaconda3 運行llm大模型、deepseek大模型的完整指南

CentOS 7 下通過 Anaconda3 運行llm大模型、deepseek大模型的完整指南A1 CentOS 7 下通過 Anaconda3 運行大模型的完整指南一、環境準備二、創建專用環境三、模型部署與運行四、優化配置常見問題解決B1 CentOS 7 下通過 Anaconda3 使用 CPU 運行 DeepSeek 大模型的完整方案一、…

Flutter應用在Windows 8上正常運行

要讓Flutter應用在Windows 8上正常運行,需滿足以下前提條件,涵蓋系統環境、依賴配置、編譯設置等關鍵環節: 一、系統環境基礎要求 Windows 8版本 必須是 Windows 8.1(核心支持),不支持早期Windows 8(需升級到8.1,微軟已停止對原版Windows 8的支持)。 確認系統版本:右…

Redis實現消息隊列三種方式

參考 Redis隊列詳解&#xff08;springboot實戰&#xff09;_redis 隊列-CSDN博客 前言 MQ消息隊列有很多種&#xff0c;比如RabbitMQ,RocketMQ,Kafka等&#xff0c;但是也可以基于redis來實現&#xff0c;可以降低系統的維護成本和實現復雜度&#xff0c;本篇介紹redis中實現…

【C++動態版本號生成方案:實現類似C# 1.0.* 的自動構建號】

C動態版本號生成方案&#xff1a;實現類似C# 1.0.* 的自動構建號 在C#中&#xff0c;1.0.*版本號格式會在編譯時自動生成構建號和修訂號。本文將介紹如何在C項目中實現類似功能&#xff0c;通過MSBuild自動化生成基于編譯時間的版本號。 實現原理 版本號構成&#xff1a;主版本…

【算法題】:斐波那契數列

用 JavaScript 實現一個 fibonacci 函數&#xff0c;滿足&#xff1a; 輸入 n&#xff08;從0開始計數&#xff09;輸出第 n 個斐波那契數&#xff08;斐波那契數列從 1 開始&#xff1a;1,1,2,3,5,8,13,21…&#xff09; 示例&#xff1a; fibonacci(0) > 1fibonacci(4) &g…

【YOLOv13[基礎]】熱力圖可視化實踐 | 腳本升級 | 優化可視化效果 | 論文必備 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

本文將進行添加YOLOv13版本的升級版熱力圖可視化功能的實踐,支持圖像熱力圖可視化、優化可視化效果、 可以選擇使用GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM, HiResCAM, LayerCAM, RandomCAM, EigenGradCAM。一個參數即可設置是否顯示檢測框等。 原圖 結果圖

ElasticSearch相關術語介紹

1.RESTful風格程序REST(英文全稱為:"Representational State Transfer")指的是一組架構約束條件和原則。它是一種軟件架構風格&#xff08;約束條件和原則的集合&#xff0c;但并不是標準&#xff09;。 REST通過資源的角度觀察網絡&#xff0c;以URI對網絡資源進行…

《從零構建大語言模型》學習筆記4,注意力機制1

《從零構建大語言模型》學習筆記4&#xff0c;自注意力機制1 文章目錄《從零構建大語言模型》學習筆記4&#xff0c;自注意力機制1前言一、實現一個簡單的無訓練權重的自注意力機制二、實現具有可訓練權重的自注意力機制1. 分步計算注意力權重2.實現自注意力Python類三、將單頭…

昇思+昇騰開發板+DeepSeek模型推理和性能優化

昇思昇騰開發板DeepSeek模型推理和性能優化 模型推理 流程&#xff1a; 權重加載 -> 啟動推理 -> 效果比較與調優 -> 性能測試 -> 性能優化 權重加載 如微調章節介紹&#xff0c;最終的模型包含兩部分&#xff1a;base model 和 LoRA adapter&#xff0c;其中base …

未給任務“Fody.WeavingTask”的必需參數“IntermediateDir”賦值。 WpfTreeView

c#專欄記錄&#xff1a; 報錯 未給任務“Fody.WeavingTask”的必需參數“IntermediateDir”賦值。 WpfTreeView 生成 解決辦法 清理和重新生成項目 完成上述配置后&#xff0c;嘗試執行以下步驟&#xff1a; 清理項目&#xff1a;刪除 bin 和 obj 文件夾。 重新生成項目&…