mysql索引及數據庫引擎

順序io(不需要每次都磁盤尋址,效率高),隨機io(需要每次都磁盤尋址,效率低)

如何正確的創建合適的索引?

索引是一種分散存儲的數據結構


磁盤io特性:每次交互是以頁為單位,每頁4K數據。innoDB每次和磁盤交互是四頁16k數據(InnoDB葉節點data域保存了完整的數據記錄相比較MYISAM(因為只存儲了葉子節點的指針,所占空間1kb都不到)更能充分利用每次磁盤io)

InnoDB 主鍵索引存儲了完整的數據庫記錄行,輔助索引僅存儲了索引和主鍵值(這里提供了一種解決海量數據分頁問題的思路,例如要取一張千萬級別數據的表中5百萬到5百萬零五十行的記錄,如何快速獲取,可以先使用輔助索引查詢找主鍵,再通過主鍵走主鍵索引獲取數據庫記錄。)

mysql索引底層使用的是B+樹,索引所有元素都位于樹的葉子節點,相鄰葉子節點間有雙向指針查找索引時先將根節點load到磁盤中(這是一個磁盤IO過程,比較耗時,)在節點中定位指向下一級節點的指針,三層B+樹飽和狀態能存儲大概2000萬個索引

什么叫做聚集索引(聚簇索引)?

就是索引鍵值的邏輯順序跟表數據行的物理存儲順序是一致的。(比如字典的目錄是按拼音排序的,內容也是按拼音排序的,按拼音排序的這種目錄就叫聚集索引)。

MYISAM引擎主鍵是非聚族索引,索引和數據分開存儲的,? 不支持事務

InnoDB是主鍵索引是聚族索引,查詢的時候不用回表,少一次磁盤IO;? 支持事務

聚族索引,B+樹葉子節點不僅包含指針還包含數據

雖然InnoDB也使用B+Tree作為索引結構,但具體實現方式卻與MyISAM截然不同。

第一個重大區別是InnoDB的數據文件本身就是索引文件。MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。而在InnoDB中,表數據文件本身就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。

無用的索引會拖垮數據庫操作的性能(更新刪除新增樹的結構要變化,節點內關鍵字會重排)

myisam引擎中B+樹數據庫記錄行的指針(5.5版本之前的默認引擎)

innodb引擎主鍵索引葉子節點存儲了索引和數據記錄(5.5版本之后的默認引擎)

列的離散性越高,選擇性就越好(離散型太低還不如全表掃描,不適合建立索引)

離散性太差,mysql可能自動不選擇索引(由mysql的查詢優化器實現)

前綴索引:當需要給長度很長的字符串字段加索引時,可以使用前綴索引,給字符串的前幾個字符位加索引,需要先判斷一下前幾位字符的離散度也就是重復率。

聯合索引:選擇原則:

1、經常用的列優先(最左匹配原則)

2、選擇性(離散度)高的列優先(離散型高原則)

3、寬度小的列優先(最少空間原則)

覆蓋索引

1、如果查詢里可通過索引節點中的關鍵字直接返回,則稱為覆蓋索引

例 user表中 聯合索引為name+age? 查詢語句為select name, age from user where name=?

則為覆蓋索引,直接返回葉子節點位置的數據,不用再回表,大大減少磁盤io,提高性能(這就是為什么公司不讓使用select * ,有可能命中覆蓋索引,只返回必要的數據,減少數據包的大小,降低數據傳輸的開銷)


索引失效的情況

1.where條件中not in、or和<>操作無法使用索引(離散型太差);

2.復合索引未用左列字段;

3.like以%開頭;

4.需要類型轉換;

5.where中索引列有運算;

6.where中索引列使用了函數;

7.如果mysql覺得全表掃描更快時(數據少,離散型差等情況);

插拔式存儲引擎

CSV存儲引擎

(數據存儲以CSV文件格式)

特點:不能定義沒有索引、列定義必須為not null 、不能設置自增列

-->不適用大表或者數據的在線處理

CSV數據的存儲用逗號隔開,可直接編輯CSV文件進行數據的編排

-->數據安全性低

應用場景:數據的快速導入導出,表格直接裝換成CSV

Archive存儲引擎

壓縮協議進行數據的存儲(ARZ文件格式)

特點:只支持insert和select兩種操作,只允許自增id建立索引,行級鎖,不支持事務,數據占用磁盤少

應用場景:日志系統,大量的設備數據采集

Memory存儲引擎(heap存儲引擎)

Myisam存儲引擎

特點:select count(*) from table無需進行數據的掃描

? ? ? ? 數據(MYD)和索引(MYI)分開存儲

? ? ? 表級鎖

? ? ? 不支持事務

Innodb(5.5版本后的默認存儲引擎)

? ? ? ? ? ? 支持事務、 行級鎖、聚集索引,支持外鍵

最后編輯于:2025-04-21 10:57:35


喜歡的朋友記得點贊、收藏、關注哦!!!

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

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

相關文章

網絡安全:sql注入練習靶場——sqli_labs安裝保姆級教程

網絡安全&#xff1a;sql注入練習靶場——sqli_labs安裝保姆級教程 前言 sqli-labs靶場是一個開源的sql注入練習的綜合靶場&#xff0c;包含大部分sql注入漏洞以及注入方式 網絡安全學習者可以通過在sqli-labs靶場練習提升對sql注入的理解&#xff0c;以及學習各種繞過姿勢。…

平臺介紹-開放API接口-鑒權

平臺的理念是一個組織內部只建一套系統。但是現實情況是&#xff0c;組織內部已經建立了很多系統&#xff0c;是不能一次性替代的&#xff0c;只能先搭起平臺&#xff0c;然后逐步開始替換。這樣就不可避免的存在其他系統和平臺進行交互的問題。 平臺為此設計了開放API接口。其…

多端定制系統開發:打造高效全平臺覆蓋的APP解決方案

在移動互聯網時代&#xff0c;用戶需求日益多樣化&#xff0c;企業若想觸達更廣泛的受眾&#xff0c;僅靠單一平臺的應用已遠遠不夠。無論是iOS、Android、Web端&#xff0c;還是智能手表、車載設備等新興終端&#xff0c;多端適配已成為企業數字化轉型的剛需。多端定制系統開發…

Linux電源管理(5)_Hibernate和Sleep功能介紹

原文&#xff1a;Linux電源管理(5)_Hibernate和Sleep功能介紹 1. 前言 Hibernate和Sleep兩個功能是Linux PM的核心功能&#xff0c;它們的目的是類似的&#xff1a;暫停使用——>保存上下文——>關閉系統以節電>恢復系統——>恢復上下文——>繼續使用。 本文…

Spring 命名空間注入:p、c 與 .util 的深度解析

在 Spring 框架的開發過程中&#xff0c;XML 配置是一種常見且強大的方式來管理 Bean。為了讓配置更加簡潔、易讀&#xff0c;Spring 提供了多種命名空間注入的方法&#xff0c;其中 p 命名空間注入、c 命名空間注入和 .util 命名空間尤為重要。本文將詳細介紹這三種命名空間的…

RUST變量學習筆記

1&#xff0c;作用域概念 捕獲環境 2&#xff0c;所有權概念 Rust則是通過所有權和借用來保證內存安全。很多人不理解為啥說Rust是內存安全的&#xff0c;其實就是在默認情況下&#xff0c;你是寫不出內存不安全的代碼的。 Rust的所有權并不難理解&#xff0c;它有且只有如下…

探索 Spring AI 的 ChatClient API:構建智能對話應用的利器

探索 Spring AI 的 ChatClient API&#xff1a;構建智能對話應用的利器 前言 在當今人工智能蓬勃發展的時代&#xff0c;智能對話系統成為了眾多應用的核心組成部分。無論是客服機器人、智能助手還是聊天應用&#xff0c;都離不開高效、靈活的對話處理能力。Spring AI 作為 S…

開源ERP系統對比:Dolibarr、ERPNext與Odoo

對于尋求開源ERP解決方案的企業而言&#xff0c;Dolibarr、ERPNext和Odoo是三個備受關注的選擇。它們各自擁有獨特的優勢和特點&#xff0c;適用于不同規模和需求的組織。以下是對這三個系統的詳細介紹和對比&#xff0c;以幫助您更好地理解它們的差異&#xff0c;并結合中文支…

【2025年】MySQL面試題總結

文章目錄 1. MySQL 支持哪些存儲引擎&#xff1f;默認使?哪個&#xff1f;2. MyISAM 和 InnoDB 有什么區別&#xff1f;3. 事務的四大特性?4. 并發事務帶來了哪些問題?5. 不可重復讀和幻讀有什么區別&#xff1f;6. MySQL 事務隔離級別&#xff1f;默認是什么級別&#xff1…

Linux常用命令29——delgroup刪除組

在使用Linux或macOS日常開發中&#xff0c;熟悉一些基本的命令有助于提高工作效率&#xff0c;delgroup 是用于刪除用戶組的一個命令。此命令通常由超級用戶&#xff08;root&#xff09;運行&#xff0c;或者通過 sudo 提權來操作。本篇學習記錄delgroup命令的基本使用。 下面…

字節暑期實習-網絡運維工程師面經

崗位描述 這個是ByteIntern實習&#xff0c;是暑期實習崗位 崗位 一面 先自我介紹 抓項目技術&#xff08;會進行確認是什么技術&#xff09; TCP的三次握手和四次揮手 序列號和確認應答號的位置和大小 序列號是隨機的嗎&#xff1f; 序列號為什么是隨機的&#xff1f; …

5.3刷題

P3370 【模板】字符串哈希 #include<bits/stdc.h> using namespace std; #define int long long typedef unsigned long long ull; int n; ull myhash(string s){ull code 0, x 131, y 140814840257324663;for(int i 0; i < s.size(); i){code (code * x (ull)…

Kettle下載安裝教程

## 什么是Kettle Kettle&#xff08;現在也稱為Pentaho Data Integration&#xff0c;簡稱PDI&#xff09;是一款開源的ETL&#xff08;Extract-Transform-Load&#xff09;工具&#xff0c;用于數據抽取、轉換和加載。它允許用戶通過圖形化界面設計和執行數據集成流程&#xf…

FreeRtos實戰從入門到精通--任務創建和刪除(動態方法)--事了拂衣去,深藏功與名

FreeRtos是之前的一些聰明的工程師寫的免費且開源的嵌入式實時操作系統代碼&#xff0c;由于我們實際工作中不需要再去寫rtos&#xff0c;我們只需要用就行了&#xff0c;所以博主這里只分享項目工程實戰相關的內容&#xff0c;具體rtos源碼&#xff0c;可以無需理會&#xff0…

Java通用Mapper自定義方法

目錄 一、定義通用 Mapper 接口二、繼承通用 Mapper 實現自定義方法三、注冊自定義 Mapper 接口四、在實體類對應的 Mapper 接口中使用自定義方法五、實現自定義方法的 SQL 邏輯注解方式XML 映射文件方式六、使用自定義方法七、注意事項在 Java 持久層開發中,MyBatis 的通用 M…

Android WebRTC回聲消除

文章目錄 安卓可用的回聲消除手段各種回聲消除技術優缺點WebRTC回聲消除WebRTC回聲消除回聲消除處理流程WebRTC AECM APP 安卓可用的回聲消除手段 硬件回聲消除 使用 AudioRecord 的 VOICE_COMMUNICATION 模式&#xff1a;通過 AudioRecord 的 VOICE_COMMUNICATION 音頻源可以…

基于 SAFM 超分辨率上采樣模塊的 YOLOv12 改進方法—模糊場景目標檢測精度提升研究

在復雜視覺環境中,如低光照、霧天或遠距離拍攝等場景下,圖像質量下降導致目標模糊,使得傳統目標檢測模型難以實現高精度識別。YOLO系列作為主流單階段檢測框架,在速度和精度方面表現出色,但在模糊和小目標場景中仍存在性能瓶頸。本文提出一種面向 YOLOv12 的創新性改進方法…

Spring 事務的底層原理常見陷阱

一、Spring 事務的底層原理 1. 核心機制 動態代理&#xff08;AOP&#xff09;&#xff1a; Spring 通過動態代理&#xff08;JDK 或 CGLIB&#xff09;生成代理對象&#xff0c;攔截被 Transactional 注解標記的方法。事務攔截器&#xff1a; TransactionInterceptor 負責管…

Java SE(6)——類和對象(一)

1.初始面向對象 1.1 什么是面向對象 Java是一門純面向對象的編程語言(Object Oriented Program&#xff0c;簡稱OOP)&#xff0c;在面向對象的世界里&#xff0c;一切皆為對象。面向對象是解決問題的一種思想&#xff0c;主要依靠對象之間的交換來完成一件事情 1.2 面向過程…

cpp細碎知識點

1 重寫 (Override): 派生類中定義一個與基類虛函數具有相同函數簽名&#xff08;函數名、參數列表、返回類型&#xff09;的函數&#xff0c;這被稱為重寫。 重寫意味著派生類提供了基類虛函數的一個特定于派生類的實現。 重寫是實現多態的關鍵 2 虛基類 (Virtual Base Class…