MySQL 索引(一)

文章目錄

  • 索引(重點)
  • 硬件理解
    • 磁盤
    • 盤片和扇區
    • 定位扇區
    • 磁盤的隨機訪問和連續訪問
  • 軟件方面的理解
  • 建立共識
  • 索引的理解

在這里插入圖片描述

索引(重點)

  1. 索引可以提高數據庫的性能,它的價值,在于提高一個海量數據的檢索速度。

在這里插入圖片描述
案例:
建立一個海量表

drop database if exists 'my_index';
create database if not exists 'my_index' default character set utf8;
use 'my_index';--構建一個8000000條記錄的數據
--構建的海量表數據需要有差異性,所以使用存儲過程來創建, 拷貝下面代碼就可以了,暫時不用理解--產生隨機字符串
delimiter $$
create function rand_string(n INT)
returns varchar(255)
begin declare chars_str varchar(100) default'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';declare return_str varchar(255) default '';declare i int default 0;while i < n do set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));set i = i + 1;end while;return return_str;end $$
delimiter ;--產生隨機數字
delimiter $$
create function rand_num()
returns int(5)
begin declare i int default 0;set i = floor(10+rand()*500);
return i;
end $$
delimiter ;--創建存儲過程,向雇員表添加海量數據
delimiter $$
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0; set autocommit = 0;  repeatset i = i + 1;insert into EMP values ((start+i) 
,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());until i = max_numend repeat;commit;
end $$
delimiter ;--執行存儲過程,添加8000000條記錄
call insert_emp(100001, 8000000);

查詢員工編號為998877的員工

select * from emp where empno=998877;

在這里插入圖片描述
花了6.17秒,就你一個人就花了6秒,如果公司人很多,會死機的

給表加上索引

alter table emp add index(empno);

很明顯加上索引之后,速度明顯變快了
在這里插入圖片描述

  1. 硬件->系統->MySQL

  2. 常見索引分為:
    主鍵索引(primary key)
    唯一索引(unique)
    普通索引(index)
    全文索引(fulltext)–解決中子文索引問題。

  3. 先整一個海量表,在查詢的時候,看看沒有索引時有什么問題?
    在海量的數據表中沒有索引查詢起來會變得很慢,如果有索引可以加快查詢的速度

  4. 給emp表添加索引

alter table emp add index(empno);

硬件理解

磁盤

  1. MySQL中的每一個表就是一個文件
  2. MySQL 給用戶提供存儲服務,而存儲的都是數據,數據在磁盤這個外設當中。磁盤是計算機中的一個機械設備,相比于計算機其他電子元件,磁盤效率是比較低的,在加上IO本身的特征,可以知道,如何提交效率,是 MySQL 的一個重要話題。
    在這里插入圖片描述

盤片和扇區

在這里插入圖片描述

  1. 扇區:數據庫文件,本質其實就是保存在磁盤的盤片當中。也就是上面的一個個小格子中,就是我們經常所說的扇區。當然,數據庫文件很大,也很多,一定需要占據多個扇區。
  2. 在半徑方向上,距離圓心越近,扇區越小,距離圓心越遠,扇區越大
  3. 那么,所有扇區都是默認512字節嗎?目前是的,我們也這樣認為。因為保證一個扇區多大,是由比特位密度決定的。
  4. 我們在使用Linux,所看到的大部分目錄或者文件,其實就是保存在硬盤當中的。(當然,有一些內存文件系統,如: proc , sys 之類,我們不考慮)
  5. 數據庫文件,本質其實就是保存在磁盤的盤片當中,就是一個一個的文件,找到一個文件的全部,本質,就是在磁盤找到所有保存文件的扇區。
  6. 而我們能夠定位任何一個扇區,那么便能找到所有扇區,因為查找方式是一樣的。

定位扇區

在這里插入圖片描述

  1. 先找到柱面,再找磁頭,最后找到扇區(chs)
  2. 系統讀取磁盤是以塊為單位的,基本單位是4kb,因為不以塊為單位,以扇區為單位的話,一個是效率太慢,磁頭每次都要轉到相應的位置開始讀取,單次是512字節,讀取的量太少,第二個是耦合度太高,不便于硬件或操作系統各自升級

磁盤的隨機訪問和連續訪問

  1. 隨機訪問:本次IO所給出的扇區地址和上次IO給出扇區地址不連續,這樣的話磁頭在兩次IO操作之間需要作比較大的移動動作才能重新開始讀/寫數據。
  2. 連續訪問:如果當次IO給出的扇區地址與上次IO結束的扇區地址是連續的,那磁頭就能很快的開始這次IO操作,這樣的多個IO操作稱為連續訪問。
  3. 因此盡管相鄰的兩次IO操作在同一時刻發出,但如果它們的請求的扇區地址相差很大的話也只能稱為隨機訪問,而非連續訪問。(所以OS的文件系統一般就會將我們的一些IO請求在底層做一些歸類和排序,盡可能地增加連續訪問的可能,另一方面減少了磁頭的擺動次數也能提高磁盤的使用壽命
  4. 磁盤是通過機械運動進行尋址的,隨機訪問不需要過多的定位,故效率比較高。

軟件方面的理解

  1. 為了提高基本的IO效率, MySQL 進行IO的基本單位是 16KB,使用 InnoDB 存儲引擎
  2. 再數據塊的流動方面都是數據塊給操作系統,操作系統給mysql,mysql給操作系統,操作系統給磁盤
  3. MySQL 中的數據文件是以page為單位保存在磁盤當中的
  4. 證明MySQL是以16kb為單位的
  5. 也就是說,磁盤這個硬件設備的基本單位是 512 字節,而 MySQL InnoDB引擎使用 16KB 進行IO交互。即, MySQL 和磁盤進行數據交互的基本單位是 16KB 。這個基本數據單元,在 MySQL 這里叫做page注意和系統的page區分

在這里插入圖片描述在這里插入圖片描述

建立共識

  1. MySQL以16kb為單位進行mysql級別的IO
  2. MySQL要有自己的buff pool(緩沖池),會把數據讀到buff pool里,把buff pool的數據刷新到操作系統的緩沖區里,最后刷新到磁盤
  3. 一定要盡可能的減少系統和磁盤IO的次數,一次IO的數據量越大,比多次IO數據量小效率更高
  4. mysql會預先開辟一個128mb的緩沖池

索引的理解

  1. 建立測試表,存儲引擎默認是InnoDB的
create table if not exists user (id int primary key,     --一定要添加主鍵哦,只有這樣才會默認生成主鍵索引age int not null,name varchar(16) not null
);
show create table user \G;
  1. 插入信息,插入5條無序的數據
--插入多條記錄,注意,我們并沒有按照主鍵的大小順序插入哦
mysql> insert into user (id, age, name) values(3, 18, '楊過');
mysql> insert into user (id, age, name) values(4, 16, '小龍女');
mysql> insert into user (id, age, name) values(2, 26, '黃蓉');
mysql> insert into user (id, age, name) values(5, 36, '郭靖');
mysql> insert into user (id, age, name) values(1, 56, '歐陽鋒');
  1. 查看表中的內容,發現數據是有序的

在這里插入圖片描述
4. 理解page

在這里插入圖片描述
5. 為何io操作要page?
為了減少IO的次數,提高IO的效率,在單個page中,不在單個page中,會進行多次IO操作
你怎么保證,用戶一定下次找的數據,就在這個Page里面?---->我們不能嚴格保證,但是有很大概率再一個Page當中或者是周圍的,因為有局部性原理。

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

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

相關文章

環境搭建-復現ST-GCN輸出動作分類視頻(win10+openpose1.7.0+VS2019+CMake3.30.1+cuda11.1)

這次我們安裝github.com/yysijie/st-gcn這個作者源碼環境&#xff0c;安裝流程十分復雜這里介紹大體流程。 1.首先編譯openpose的python API接口這個編譯難度較大&#xff0c;具體參考博文&#xff1a;windows編譯openpose及在python中調用_python openpose-CSDN博客 這個博…

HTML屬性

HTML&#xff08;HyperText Markup Language&#xff09;是網頁開發的基石&#xff0c;而屬性&#xff08;Attribute&#xff09;則是HTML元素的重要組成部分。它們為標簽提供附加信息&#xff0c;控制元素的行為、樣式或功能。本文將從基礎到進階&#xff0c;全面解析HTML屬性…

2025年“深圳杯”數學建模挑戰賽C題國獎大佬萬字思路助攻

完整版1.5萬字論文思路和Python代碼下載&#xff1a;https://www.jdmm.cc/file/2712073/ 引言 本題目旨在分析分布式能源 (Distributed Generation, DG) 接入配電網系統后帶來的風險。核心風險評估公式為&#xff1a; R P_{loss} \times C_{loss} P_{over} \times C_{over}…

兩數相加(2)

2. 兩數相加 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode * dummy new ListNode(0);int carry 0;ListNode * head dummy;while (l1 ! nullptr || l2 ! nullptr ||…

基于大模型的新型隱球菌腦膜炎智能診療全流程系統設計與實現的技術方案文檔

目錄 一、術前風險預測系統1. 多模態融合模型架構2. 風險預測流程圖(Mermaid)二、麻醉劑量預測系統1. 靶控輸注(TCI)模型2. 麻醉方案優化流程圖(Mermaid)三、術后并發癥預測模型1. 時序預測模型(LSTM)2. 并發癥預測流程圖(Mermaid)四、健康教育管理模塊1. 移動健康(…

coze工作流完成行業調研報告

一、coze 是什么&#xff1f; Coze是由字節跳動推出的新一代AI應用開發平臺&#xff0c;定位是零代碼或低代碼的AI開發平臺&#xff0c;也被稱為字節跳動版的GPTs &#xff0c;國內版名為“扣子”。 Coze有國內版和國外版兩個版本。國內版網址為http://www.coze.cn &#xff…

智慧農業運維平臺養殖—傳感器管理監控設計—仙盟創夢IDE

智慧農業綜合監測與智能執行系統簡介 該系統圍繞農業生產全流程&#xff0c;融合氣象環境監測、農技指導精準推送及多維度智能控制&#xff0c;助力農業高效、科學發展。 氣象環境與農技指導&#xff1a;于農業現場部署慧云智能物聯網設備&#xff0c;實時監測空氣溫濕度、光照…

docker 鏡像的導出和導入(導出完整鏡像和導出容器快照)

一、導出原始鏡像 1. 使用 docker save 導出完整鏡像 適用場景&#xff1a;保留鏡像的所有層、元數據、標簽和歷史記錄&#xff0c;適合遷移或備份完整鏡像環境。 操作命令 docker save -o <導出文件名.tar> <鏡像名:標簽>示例&#xff1a;docker save -o milvu…

Spring循環依賴問題

個人理解&#xff0c;有問題歡迎指正。 Spring 生命周期中&#xff0c;首先使用構造方法對 bean 實例化&#xff0c;實例化完成之后才將不完全的 bean放入三級緩存中提前暴露出 bean&#xff0c;然后進行屬性賦值&#xff0c;此時容易出現循環依賴問題。 由此可見&#xff0c;…

JAVA自動裝箱拆箱

引言 Java 中的**裝箱&#xff08;Boxing&#xff09;和拆箱&#xff08;Unboxing&#xff09;**是自動類型轉換的機制&#xff0c;用于在基本數據類型&#xff08;如 int、long 等&#xff09;和其對應的包裝類&#xff08;如 Integer、Long 等&#xff09;之間進行轉換。這種…

如何閱讀、學習 Linux 2 內核源代碼 ?

學習Linux 2內核源代碼是深入理解操作系統工作原理的絕佳途徑&#xff0c;但這無疑是一項極具挑戰性的任務。下面為你提供一套系統的學習方法和建議&#xff1a; 一、扎實基礎知識 操作系統原理 透徹掌握進程管理、內存管理、文件系統、設備驅動等核心概念。推薦閱讀《操作系…

樹莓派4的v4l2攝像頭(csi)no cameras available,完美解決

根據2025年最新技術文檔和樹莓派官方支持建議&#xff0c;no cameras available錯誤通常由驅動配置沖突或硬件連接問題導致。以下是系統化解決方案&#xff1a; 一、核心修復步驟 強制禁用傳統驅動 sudo nano /boot/firmware/config.txt確保包含以下配置&#xff08;2025年新版…

c++學習之路(3)

通過《c學習之路&#xff08;2&#xff09;》的學習&#xff0c;我們已經掌握了數據的儲存&#xff0c;以及數據的讀入與輸出&#xff0c;這次課程&#xff0c;我們要學習if語句的使用方法以及邏輯表達式請各位學者做好準備&#xff0c;謝謝配合&#xff01;&#xff01;&#…

Java程序題案例分析

目錄 一、基礎語法 1. 類與對象 2. 接口與抽象類 二、面向對象語法 1. 繼承與多態 2. 四種訪問修飾符 三、設計模式相關語法 一、策略模式&#xff08;接口回調實現&#xff09; 1. 完整實現與解析 二、工廠模式&#xff08;靜態工廠方法實現&#xff09; 1. 完整實…

comfyu BiRefNet-General模型下載及存放地方

https://huggingface.co/ZhengPeng7/BiRefNet/tree/main

HunyuanCustom:文生視頻框架論文速讀

《HunyuanCustom: A Multimodal-Driven Architecture for Customized Video Generation》論文講解 一、引言 本文提出了 HunyuanCustom&#xff0c;這是一個基于多模態驅動的定制化視頻生成框架。該框架旨在解決現有視頻生成模型在身份一致性&#xff08;identity consistenc…

tryhackme——Enumerating Active Directory

文章目錄 一、憑據注入1.1 RUNAS1.2 SYSVOL1.3 IP和主機名 二、通過Microsoft Management Console枚舉AD三、通過命令行net命令枚舉四、通過powershell枚舉 一、憑據注入 1.1 RUNAS 當獲得AD憑證<用戶名>:<密碼>但無法登錄域內機器時&#xff0c;runas.exe可幫助…

Web3 學習全流程攻略

目錄 ?? Web3 學習全流程攻略 ?? 第一階段:打好基礎(Web3 入門) ?? 目標: ?? 學習內容: ? 推薦資源: ????? 第二階段:技術棧搭建(成為 Web3 開發者) ?? 目標: ?? 學習內容: ? 推薦資源: ?? 第三階段:構建完整 DApp(去中心化應用)…

Python程序打包為EXE文件的全面指南

Python程序打包為EXE文件的全面指南 Python程序打包為EXE文件是解決程序分發和環境依賴問題的有效方法。通過將Python腳本及其所有依賴項整合為單一可執行文件&#xff0c;用戶無需安裝Python解釋器即可直接運行程序&#xff0c;極大提升了應用的便攜性和用戶體驗。本文將深入…

22、城堡防御工事——React 19 錯誤邊界與監控

一、魔法護盾&#xff1a;錯誤邊界機制 1. 城墻結界&#xff08;Error Boundary&#xff09; // 客戶端錯誤邊界use client function useErrorBoundary() {const [error, setError] useState(null);?const handleError useCallback((error, errorInfo) > {setError(erro…