MySQL_7.索引概述

1.什么是索引
在關系數據庫中,索引是一種單獨的、物理的數對數據庫表中一列或多列的值進行排序的一種存儲結構。
它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單

2.索引的優點
(1)通過創建唯一性索引,可以保證數據庫表中每一行數據的唯一性。
(2)可以加速表和表之間的連接,特別是在實現數據的參考完整性方面特別有意義。
(3)在使用分組和排序子句進行數據查詢時,可以減少查詢中分組和排序的時間。
(4)通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的性能。

3.索引的缺點
(1)創建索引和維護索引要耗費時,這種時間隨著數據量的增加而增加。
(2)索引需要占物理空間,除了數據表占數據空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大。
(3)當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。

4.索引的分類
(1)B樹索引 (主要,默認索引):mysql innodb默認的索引類型就是 Btree索引(B樹,B-樹,B+樹,B*樹),Binary Tree,就是一個二叉樹。
(2)hash索引:Hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree索引需要從根節點到枝節點,
最后才能訪問到頁節點這樣多次的IO訪問,所以Hash索引的查詢效率要遠高于B-Tree索引,僅僅能滿足"=" "IN" 和 "<=>" 查詢,不能使用范圍查詢。
只有 Memory存儲引擎顯示支持hash索引。
(3)FULLTEXT索引 (全文檢索,MYISAM和INNODB引擎都支持了)。
(4)R-tree索引 (用于對GIS數據類型創建 SPATIAL 空間索引)

5.索引按邏輯的分類
(1)主鍵索引
(2)普通索引 or 單列索引
(3)多列索引(復合索引)
(4)唯一索引或者非唯一索引
(5)空間索引

6.B-樹的由來
為迎合磁盤與內存的速度差,減少磁盤IO次數,提高性能
注(數據量非常大時,內存不夠用,大部分數據只能存放在磁盤上,只有需要的數據才加載到內存中。
一般而言內存訪問的時間約為 50 ns(納秒),而磁盤在 10 ms (毫秒))

7.B-樹和B+樹的區別
(1)B+樹內節點不存儲數據,所有 data 存儲在葉節點導致查詢時間復雜度固定為 log(n)。而B-樹查詢時間復雜度不固定,與 key 在樹中的位置有關, 最好為O(1)。
(2)B+樹葉節點兩兩相連可大大增加區間訪問性,可使用在范圍查詢等,而B-樹每個節點 key 和 data 在一起,則無法區間查找。
(3)B+樹更適合外部存儲。由于內節點無 data 域,每個節點能索引的范圍更大更精確
(4)在數據結構上:B樹為有序數組+平衡多叉樹,而B+樹為有序數組鏈表+平衡多叉樹

8.為什么 Mysql 使用B+樹?
Mysql 是一種關系型數據庫,區間訪問是常見的一種情況,而 B-樹并不支持區間訪問(可參見上圖),
而B+樹由于數據全部存儲在 葉子節點,并且通過指針串在一起,這樣就很容易的進行區間遍歷甚至全部遍歷。
(1)B+樹葉節點兩兩相連可大大增加區間訪問性,可使用在范圍查詢等,而B-樹每個節點 key 和 data 在一起,則無法區間查找?
(2)B+樹的查詢效率更加穩定,數據全部存儲在葉子節點,查詢時間復雜度固定為 O(log n)
(3)B+樹更適合外部存儲。由于內節點無 data 域,每個節點能索引的范圍更大更精確

9.mysql索引使用
(1)創建索引

create index index_name on table_name(col_name);


(2)為已創建的表增加索引

alter table table_name add index index_name(col_name);


(3)查看已創建索引:

show index from yzjtestdb.yzjtest_m1


(4)索引使用:

explain select * from yzjtestdb.yzjtest_m1 where name = 'yzjtest30000010';
explain select * from yzjtestdb.yzjtest_m1 where tel = '13379855952';


(5)索引刪除:

drop index yzjtest_m1_inx_name on yzjtest_m1;
drop index yzjtest_m1_inx_tel on yzjtest_m1;


(6)復合索引使用管理
# 語法:

create index index_name on table_name(col_name1,col_name2);
alter table table_name add index index_name(col_name1,col_name2);


# 案例:

use yzjtestdb;
create index yzjtest_m1_inx_name_tel on yzjtestdb.yzjtest_m1(NAME,TEL);
alter table yzjtestdb.yzjtest_m1 add index yzjtest_m1_inx_name_tel(NAME,TEL);


查看已創建索引:

show index from yzjtestdb.yzjtest_m1;


# 索引使用:

explain select * from yzjtestdb.yzjtest_m1 where name = 'yzjtest30000010'and tel = '13379855952';


# 索引刪除:

drop index yzjtest_m1_inx_name_tel on yzjtest_m1;


?

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

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

相關文章

編寫Yaml文件當Poc,利用Nuclei掃描器去掃描漏洞

編寫Yaml文件當Poc,利用Nuclei掃描器去掃描漏洞 YAML是一種數據序列化語言&#xff0c;它的基本語法規則注意如下&#xff1a; -大小寫敏感 -使用縮進表示層級關系 -縮進時不允許使用Tab鍵&#xff0c;只允許使用空格。 -縮進的空格數目不重要&#xff0c;只要相同層級的元…

VSCode如何設置Vue前端的debug調試

vscode在調試vue.代碼時&#xff0c;如何進行debug? 1.安裝Chrome Debug插件。 2.在launch.json中&#xff0c;將url修改成你前端項目的路徑&#xff1a; 1 {2 // Use IntelliSense to learn about possible attributes.3 // Hover to view descriptions of existing att…

redis 三主三從高可用集群docker swarm

由于數據量過大&#xff0c;單個Master復制集難以承擔&#xff0c;因此需要對多個復制集進行集群&#xff0c;形成水平擴展每個復制集只負責存儲整個數據集的一部分&#xff0c;這就是Redis的集群&#xff0c;其作用是提供在多個Redis節點間共享數據的程序集。 官網介紹地址 re…

Elasticsearch:向量數據庫的真相

通過工作示例了解什么是向量數據庫、它們如何實現 “相似性” 搜索以及它們可以在明顯的 LLM 空間之外的哪些地方使用。除非你一直生活在巖石下&#xff0c;否則你可能聽說過諸如生成式人工智能和大型語言模型&#xff08;LLM&#xff09;之類的術語。 除此之外&#xff0c;你很…

如何利用Axure制作移動端產品原型

Axure是一款專業的快速原型設計工具&#xff0c;作為專業的原型設計工具&#xff0c;Axure 能夠快速、高效地創建原型&#xff0c;同時支持多人協作設計和版本控制管理。它已經得到了許多大公司的采用&#xff0c;如IBM、微軟、思科、eBay等&#xff0c;這些公司都利用Axure 進…

android 13.0 Settings去掉二級三級菜單搜索功能

1.概述 在13.0的系統rom定制化開發中,由于客戶定制開發需求,需要去掉Settings里面的搜索功能,主頁面的搜索功能,在前面的章節已經講了 這里需要去掉二級三級菜單的搜索功能,需要從搜索功能流程分析去掉搜索功能 2.Settings去掉二級三級菜單搜索功能核心代碼 packages/ap…

stl模板庫成員函數重載類型混肴編譯不通過解決方法

stl模板庫成員函數重載類型混肴編譯不通過解決方法 這種方式編譯不通過IsArithmetic和HasMemberList編譯器存在混肴 template <typename T, typename Enable std::enable_if<IsArithmetic<T>::value>::type >static void DumpWrapper(T* filed, std::strin…

SAP UI5 walkthrough step7 JSON Model

這個章節&#xff0c;幫助我們理解MVC架構中的M 我們將會在APP中新增一個輸入框&#xff0c;并將輸入的值綁定到model&#xff0c;然后將其作為描述&#xff0c;直接顯示在輸入框的右邊 首先修改App.controllers.js webapp/controller/App.controller.js sap.ui.define([&…

python變量的命名和使用

變量名只能包含字母、數字和下劃線 變量名只能包含字母、數字和下劃線。變量名可以字母或下劃線打頭&#xff0c;但不能以數字打頭。例如&#xff0c;可將變量命名為message_1&#xff0c;但不能將其命名為1_message。 Python 語言中&#xff0c;以下劃線開頭的標識符有特殊含…

Redis server啟動源碼

入口main函數 src/redis.c文件main函數 int main(int argc, char **argv) {struct timeval tv;/* We need to initialize our libraries, and the server configuration. */// 初始化庫 #ifdef INIT_SETPROCTITLE_REPLACEMENTspt_init(argc, argv); #endif//設置本地時間setl…

翻譯: 生成式人工智能的經濟潛力 第3部分工作和生產力的影響 The economic potential of generative AI

麥肯錫報告 翻譯: 生成式人工智能的經濟潛力 第一部分商業價值 The economic potential of generative AI翻譯: 生成式人工智能的經濟潛力 第2部分行業影響 The economic potential of generative AI 1. 工作和生產力的影響 技術幾十年來一直在改變工作的解剖學。多年來&…

vue全屏事件與關閉全屏事件

首先&#xff0c;在 Vue 組件中&#xff0c;可以使用 click 或者 v-on 來監聽點擊事件&#xff0c;然后通過調用相應的方法來觸發全屏或關閉全屏。 執行requestFullscreen事件 <template><div><button click"enterFullScreen">進入全屏</butt…

前端知識(十二)———ES6迭代器

ES6中的迭代器是一種新的對象&#xff0c;它具有一個next()方法。next()方法返回一個對象&#xff0c;這個對象包含兩個屬性&#xff1a;value和done。value屬性是迭代器中的下一個值&#xff0c;done屬性是一個布爾值&#xff0c;表示迭代器是否已經遍歷完所有的值。迭代器是一…

js實現在線預覽(PC)圖片(jpg、png)、pdf、excel(xlsx)、docx

js實現圖片預覽 參考&#xff1a;添加鏈接描述 圖片預覽 本來用的是element-plus自帶的組件el-image&#xff0c;但是去不掉縮略圖&#xff0c;所以換成了el-imag-viewer組件&#xff08;圖片可拖拽&#xff09;&#xff0c;由于用的vite沒有require方法&#xff0c;需要自己處…

c++新經典模板與泛型編程:const修飾符的移除與增加

const修飾符的移除 讓你來寫移除const修飾符&#xff0c;你會怎么樣來寫&#xff1f; &#x1f602;&#x1f602;trait類模板&#xff0c;如下 #include <iostream>// 泛化版本 template<typename T> struct RemoveConst {using type T; };// 特化版本 template…

docker-compose 常用命令和指令

目錄 1. 概要 2. 常用的docker-compose命令 2.1、image 2.2、build 2.3、command 2.4、links 2.5、external_links 2.6、ports 1.7、expose 1.8、volumes 1.9、volumes_from 1.10、environment 1.11、networks 1. 概要 默認的模板文件是 docker-compose.yml&…

阿里云(云服務器)上搭建項目部署環境

目錄 安裝docker docker安裝MySQL5.7.37 安裝MySQL 方式一&#xff1a;docker中MySQL時區調整 方式二&#xff1a;docker中MySQL時區調整 docker安裝MySQL8.0.27 docker安裝redis5.0.14 云服務器上安裝jdk1.8 安裝docker 1、先卸載docker&#xff0c;因為有一些服務器…

西南科技大學C++程序設計實驗十(函數模板與類模板)

一、實驗目的 1. 掌握函數模板與類模板; 2. 掌握數組類、鏈表類等線性群體數據類型定義與使用; 二、實驗任務 1. 分析完善以下程序,理解模板類的使用: (1)補充類模板聲明語句。 (2)創建不同類型的類對象,使用時明確其數據類型? _template<typename T>__…

c-語言->數據在內存的存儲

系列文章目錄 文章目錄 系列文章目錄前言 前言 目的&#xff1a;學習整數在內存的儲存&#xff0c;什么是大小端&#xff0c;浮點數的儲存。 1. 整數在內存中的存儲 在講解操作符的時候&#xff0c;我們就講過了下?的內容&#xff1a; 整數的2進制表??法有三種&#xff0…

設計模式之觀察者模式(主題對象發生變化,通知各個觀察者)

當涉及到電商場景時&#xff0c;觀察者模式可以用于處理多種情況&#xff0c;比如訂單狀態更新、庫存變化、用戶積分變化等。下面是一個簡化的訂單狀態更新的觀察者模式案例。 1.首先&#xff0c;定義一個主題接口 OrderSubject /*** Description:主題&#xff0c;用于管理觀察…