MySQL(四)--索引

MySQL的服務器,本質是在內存中的,那么所有對數據的CURD操作,全都是在對內存進行操作。

而,提高數據的CURD操作的效率,有兩種方式:1、組織數據的格式(數據結構);2、算法。

而,數據結構,就是索引,即組織數據的格式。

1、沒有索引的問題

索引:提高數據庫的性能,索引是物美價廉的東西了。不用加內存,不用改程序,不用調sql,只要執行正確的 create index,查詢速度就可能提高成百上千倍。

即:索引的存在,提高了數據的查詢效率,但是降低了數據的插入刪除效率。

但是對于數據來說,大部分時間還是在于讀操作。

1.1、常見索引

主鍵索引primary key
唯一索引unique
普通索引index
全文索引fulltext

因此,之前在表中創建“鍵”,其實就是在創建一個索引。

2、認識磁盤

MySQL 給用戶提供存儲服務,而存儲的都是數據,數據在磁盤這個外設當中。

由馮諾依曼體系結構可知,磁盤的IO效率是很慢的。

因此,如何提高效率,是MySQL的一個重要話題。

再看看磁盤中的一個盤片:

如今,一個扇區的大小已經提升到4KB了,即4096字節。

并且如今,OS和磁盤的交互大小,就是以4KB為交互單位了。

我們在使用Linux,所看到的大部分目錄或者文件,其實就是保存在硬盤當中的。

因此,最基本的,找到一個文件的全部,本質,就是在磁盤找到所有保存文件的扇區。

而對于定位扇區,是有CSH定址法的:

2.1、磁盤隨機訪問

本次IO所給出的扇區地址和上次IO給出扇區地址不連續,這樣的話磁頭在兩次IO操作之間需要作比較大的移動動作才能重新開始讀/寫數據。

2.2、磁盤連續訪問

如果當次IO給出的扇區地址與上次IO結束的扇區地址是連續的,那磁頭就能很快的開始這次 IO操作,這樣的多個IO操作稱為連續訪問。

因此盡管相鄰的兩次IO操作在同一時刻發出,但如果它們的請求的扇區地址相差很大的話也只能稱為隨 機訪問,而非連續訪問。 磁盤是通過機械運動進行尋址的,隨機訪問不需要過多的定位,故效率比較高。

3、MySQL與磁盤交互單位--Page

而MySQL作為一款應用軟件,可以想象成一種特殊的文件系統。

它有著更高的IO場景,所以,為了提高基本的IO效率, MySQL 進行IO的基本單位是16KB。(InnoDB,之后均已InnoDB舉例了。)

mysql> SHOW GLOBAL STATUS LIKE 'innodb_page_size';+------------------+-------+| Variable_name    | Value |+------------------+-------+| Innodb_page_size | 16384 |   ---- 16384 = 16 * 1024+------------------+-------+1 row in set (0.01 sec)

也就是說,磁盤的基本單位是4KB,而MySQL InnoDB引擎采用16KB進行IO交互。

這個16KB,在MySQL這里,成為Page。

4、建立共識

MySQL中的數據文件,是以Page為單位,保存在磁盤當中的。
MySQL的CURD操作,都需要計算得到對應的數據位置。
只要涉及計算操作,就要CPU參與,而為了便于CPU參與計算,一定要率先將數據移動到內存中。

所以,在特定的時間內,內存和磁盤中都是有數據的。

后續數據操作完畢后,以某種刷新策略,將數據從內存刷新到磁盤中去。

此時就涉及到內存和磁盤的IO了,此時的IO單位就是Page。        

MySQL為了更好的執行上述操作,MySQL服務器在內存中運行的時候,就在服務器內部,申請了一塊被成為“Buffer Pool”的大塊內存空間,來進行各種緩存。
由馮諾依曼體系可以知道,想要提高效率,必須要減少系統和磁盤的IO次數。

5、初步理解索引

5.1、建立測試表

必須要添加主鍵,才會默認生成主鍵索引。

create table if not exists user ( id int primary key,     --一定要添加主鍵哦,只有這樣才會默認生成主鍵索引age int not null,name varchar(16) not null
);

 查看建表信息,默認采用的是InnoDB存儲引擎。(也是我們配置過的)

mysql> show create table user \G*************************** 1. row ***************************Table: userCreate Table: CREATE TABLE `user` (`id` int(11) NOT NULL,`age` int(11) NOT NULL,`name` varchar(16) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=

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

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

相關文章

C# (WinForms) 使用 iTextSharp 庫將圖片轉換為 PDF

iTextSharp簡介 iTextSharp 是一個開源的 .NET 庫,主要用于創建和操作 PDF 文檔。它是 iText 的 .NET 版本,iText 是一個廣泛使用的 Java 庫。iTextSharp 繼承了 iText 的核心功能并進行了適應 .NET 平臺的調整。 iTextSharp 的主要功能包括&#xff1a…

ubuntu防火墻設置(四)——iptables語法與防火墻基礎配置

前面介紹的ufw和firewall-config均為iptables的前端, 分別適合個人用戶和服務器網絡管理 下面介紹底層——ipables iptables是一個強大的工具,用于配置Linux系統的防火墻。以下是一些基本的使用方法和示例,幫助您入門: 基本語法 …

【中間件開發】Redis基礎命令詳解及概念介紹

文章目錄 前言一、Redis相關命令詳解及原理1.1 string、set、zset、list、hash1.1.1 string1.1.2 list1.1.3 hash1.1.4 set1.1.5 zset 1.2 分布式鎖的實現1.3 lua腳本解決ACID原子性1.4 Redis事務的ACID性質分析 二、Redis協議與異步方式2.1 Redis協議解析2.1.1 redis pipeline…

力扣每日一題 - 999. 可以被一步捕獲的棋子數

題目 還需要你前往力扣官網查看詳細的題目要求 地址 1.給定一個 8 x 8 的棋盤,只有一個 白色的車,用字符 R 表示。棋盤上還可能存在白色的象 B 以及黑色的卒 p。空方塊用字符 . 表示。2.車可以按水平或豎直方向(上,下,…

[UVM]在UVM環境中加入C++內存模塊

摘要:要在UVM環境中實現一個內存模塊并存入數據,您可以遵循以下步驟。這里會涉及C的內存建模和UVM的SystemVerilog部分的接口。在高層次上,我們將描述如何在C中實現內存模型并通過UVM的DPI接口訪問它。 一、C內存模型 首先,在C中…

學習記錄,正則表達式, 隱式轉換

正則表達式 \\:表示正則表達式 W: 表示一個非字(不是一個字,例如:空格,逗號,句號) W: 多個非字 基本組成部分 1.字符字面量: 普通字符:在正則表達式中,大…

Selenium是廣泛使用的模擬瀏覽器運行的庫

簡介 Selenium是廣泛使用的模擬瀏覽器運行的庫,它是一個用于Web應用程序測試的工具。 Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣,并且支持大多數現代 Web 瀏覽器。 環境 安裝 pip install selenium下載Chrome驅動 系統環境…

網絡練級寶典-> UDP傳輸層協議

目錄 傳輸層 端口號 端口號和進程的關系 UDP協議 UDP協議格式 UDP數據封裝: UDP數據分用: 面向數據報 UDP的緩沖區 UDP的缺點 基于UDP的應用層協議 傳輸層 端口號 我們知道端口號對應的其實就是一個進程的pid,在操作系統中二者的…

Redis原理—1.Redis數據結構

大綱 1.Redis的數據結構 2.Redis的SDS 3.Redis的鏈表 4.Redis的字典 5.Redis的跳躍表 6.Redis的整數集合 7.Redis的壓縮列表 8.Redis的對象 9.Redis對象的幾個關鍵屬性 10.Redis的單線程為什么這么快 11.Redis的典型應用場景和說明 12.Redis的相關命令說明 1.Redis…

【Vue3中Router使用】

Vue3中Router使用 1. 安裝vue-router組件2. 建兩個測試頁面2.1 測試頁面Home.vue2.2 測試頁面Category.vue 3. 創建路由對象4. 在入口main.js中引入router把App.vue改成路由頁面5. 測試5.1 關閉檢查解決ESlint報錯5.2 改文件名解決ESlint檢查報錯測試WebHashHistory 和WebHisto…

python拆分Excel文件

按Sheet拆分Excel 或 按照某一列的不同值拆分Excel。文檔樣式如下: 結果:紅色是按照Sheet名拆出的,藍色和橙色是某個Sheet按照某列的不同值拆分的。 代碼: # -*- coding: utf-8 -*- """ 拆分excel文件——按照…

交易所 Level-2 歷史行情數據自動化導入攻略

用戶部署完 DolphinDB 后,需要將歷史股票數據批量導入數據庫,再進行數據查詢、計算和分析等操作。DolphinDB 開發了 ExchData 模塊,主要用于滬深交易所 Level-2 行情原始數據的自動化導入,目前已支持的數據源包括: 滬…

開源ISP介紹(2)————嵌入式Vitis搭建

Vivado搭建參考前一節Vivado基于IP核的視頻處理框架搭建: 開源ISP介紹(1)——開源ISP的Vivado框架搭建-CSDN博客 導出Hardware 在vivado中導出Hardware文件,成功綜合—實現—生成比特流后導出硬件.xsa文件。(注意導…

Node.js JWT認證教程

Node.js JWT認證教程 1. 項目介紹 JSON Web Token (JWT) 是一種安全的跨域身份驗證解決方案,在現代Web應用中廣泛使用。本教程將詳細講解如何在Node.js中實現JWT認證。 2. 項目準備 2.1 初始化項目 # 創建項目目錄 mkdir nodejs-jwt-auth cd nodejs-jwt-auth# …

109.【C語言】數據結構之二叉樹層序遍歷

目錄 1.知識回顧 2.代碼實現 準備工作 LevelOrder函數 代碼框架 關鍵代碼 3.執行結果 1.知識回顧 層序遍歷參見106.【C語言】數據結構之二叉樹的三種遞歸遍歷方式文章 截取的部分內容 定義:按層的方式遍歷(,設n為樹的深度,h1-->h2-->h3-->...-->hn) 以下面…

Ruby On Rails 筆記2——表的基本知識

Active Record Basics — Ruby on Rails Guides Active Record Migrations — Ruby on Rails Guides 原文鏈接自取 1.Active Record是什么? Active Record是MVC模式中M的一部分,是負責展示數據和業務邏輯的一層,可以幫助你創建和使用Ruby…

安裝部署PowerDNS--實現內網DNS解析

PDNS是PowerDNS的縮寫,是一個開源的DNS服務器軟件。PowerDNS具有高性能、靈活性和可擴展性,可用于搭建各種規模的DNS解析服務。它支持多種后端數據庫(如MySQL、PostgreSQL等),提供高度定制化的配置選項,并具…

13.在 Vue 3 中使用OpenLayers加載鷹眼控件示例教程

在 WebGIS 開發中,鷹眼控件 是一個常用的功能,它可以為用戶提供當前地圖位置的概覽,幫助更好地定位和導航。在本文中,我們將基于 Vue 3 的 Composition API 和 OpenLayers,創建一個簡單的鷹眼控件示例。 效果預覽 在最…

Elasticsearch 單節點安全配置與用戶認證

Elasticsearch 單節點安全配置與用戶認證 安全掃描時發現了一個高危漏洞:Elasticsearch 未授權訪問 。在使用 Elasticsearch 構建搜索引擎或處理大規模數據時,需要啟用基本的安全功能來防止未經授權的訪問。本文將通過簡單的配置步驟,為單節…

使用C#基于ADO.NET編寫MySQL的程序

MySQL 是一個領先的開源數據庫管理系統。它是一個多用戶、多線程的數據庫管理系統。MySQL 在網絡上特別流行。MySQL 數據庫可在大多數重要的操作系統平臺上使用。它可在 BSD Unix、Linux、Windows 或 Mac OS 上運行。MySQL 有兩個版本:MySQL 服務器系統和 MySQL 嵌入…