MYSQL數據庫之索引

1、引入索引的問題

在圖書館查找一本書的過程,可類比數據庫查詢場景。在一般軟件系統中,對數據庫操作以查詢為主,數據量較大時,優化查詢是關鍵,索引便是優化查詢的重要手段 。

2、索引是什么

索引是一種特殊文件,包含對數據表所有記錄的引用指針,類似書的目錄,能加快查詢速度 。
其核心特點:

  • 是幫助 MySQL 高效獲取數據的數據結構
  • 存儲在文件系統中
  • 文件存儲形式與存儲引擎有關
  • 有特定的文件結構

3、索引為什么選擇 B + 樹

(1)可選數據結構及特點

可作為索引的數據結構有?hash表二叉樹b樹b + 樹?,不同結構特點如下:

hash 表缺點
  1. 存儲需將所有數據文件加載到內存,浪費空間
  2. 等值查詢快,但實際工作中范圍查詢更多,hash 不適用

(2)B + 樹優勢(結合場景選擇,文檔未詳細展開,可理解為綜合適配數據庫查詢需求 )

B + 樹在范圍查詢、數據存儲效率、樹結構高度(影響查詢次數 )等方面表現更優,適合作為 MySQL 索引結構 。

4、測試索引(完整流程)

(1)創建數據庫

在 MySQL 中創建?test_indexdb?數據庫,操作:

mysql> create database test_indexdb;  
Query OK, 1 row affected (0.01 sec)  

(2)創建數據表

在?test_indexdb?中創建?test_index?表,操作:

mysql> use test_indexdb;  
Database changed  
mysql> create table test_index(title varchar(20));  
Query OK, 0 rows affected (0.01 sec)  

(3)插入測試數據(C 程序實現)

編寫 C 程序向表中插入 1 萬條字符串數據,代碼:

#include <stdio.h>  
#include <stdlib.h>  
#include <unistd.h>  
#include <string.h>  
#include <mysql/mysql.h>  int main()  
{  MYSQL mysql_conn;  MYSQL *mysql = mysql_init(&mysql_conn);  if (mysql == NULL)  {  printf("init err\n");  exit(1);  }  mysql = mysql_real_connect(mysql,"localhost","root","Abc_111111","test_indexdb",3306,NULL,0);  if (mysql == NULL)  {  printf("connect err\n");  exit(1);  }  char sql_buff[128] = {0};  for( int i = 0;i < 10000; i++ )  {  sprintf(sql_buff,"insert into test_index values('test-%d')",i);  if (mysql_query(mysql,sql_buff) != 0 )  {  printf("insert into err\n");  break;  }  }  mysql_close(mysql);  
}  

編譯與運行

# 編譯(鏈接 MySQL 客戶端庫)  
stu@stu-virtual-machine:~/mysql_dir$ gcc -o test_index test_index.c -lmysqlclient  # 運行程序插入數據  
stu@stu-virtual-machine:~/mysql_dir$ ./test_index  
# 執行時大約需要10秒時間  

(4)查詢驗證(對比索引效果)

① 開啟運行時間監測
set profiling=1;  
② 查找數據(無索引時)

查找?title='test-9999'?的數據,語句:

select * from test_index where title='test-9999';  
③ 查看執行時間
show profiles;  
④ 創建索引

為?test_index?表的?title?列創建索引,語句:

create index title_index on test_index(title(20));  
⑤ 再次查詢并查看時間

執行查詢語句:

select * from test_index where title='test-9999';  

查看執行時間:

show profiles;  
⑥ 結果對比(示例,以實際執行為準 )
mysql> show profiles;  
+----------+------------+----------------------------------------------------+  
| Query_ID | Duration   | Query                                              |  
+----------+------------+----------------------------------------------------+  
| 1        | 0.00681275 | select * from test_index where title='test-9999'   |  
| 2        | 0.00067400 | show create table test_index                       |  
| 3        | 0.08281450 | create index t_index on test_index(title(20))      |  
| 4        | 0.00071700 | select * from test_index where title='test-9999'   |  
| 5        | 0.00045275 | show create table test_index                       |  
| 6        | 0.00930825 | drop index t_index on test_index                   |  
| 7        | 0.00841750 | select * from test_index where title='test-9999'   |  
| 8        | 0.05149600 | create index t_index on test_index(title(20))      |  
| 9        | 0.00043150 | select * from test_index where title='test-9999'   |  
+----------+------------+----------------------------------------------------+  

可觀察到,創建索引后查詢時長(如 Query_ID=4、9 )明顯縮短。

⑦ 刪除索引

若需刪除創建的索引,語句:

drop index t_index on test_index;  

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

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

相關文章

ArcGIS以及ArcGIS Pro如何去除在線地圖制作者名單

問題&#xff1a;ArcGIS和ArcGIS Pro提供了許多在線地圖服務&#xff0c;但是這些地圖會自動生成制作者名單&#xff0c;如下圖所示&#xff1a; 在線地圖加載方式可參考&#xff1a;如何在ArcGIS和ArcGIS Pro中添加在線底圖 這在出圖時有時會造成圖的部分信息遮擋或出圖不美觀…

InfluxDB 與 Golang 框架集成:Gin 實戰指南(二)

四、實際應用案例4.1 案例背景某智能工廠部署了大量的物聯網設備&#xff0c;如傳感器、智能儀表等&#xff0c;用于實時監測生產線上設備的運行狀態、環境參數&#xff08;如溫度、濕度&#xff09;以及生產過程中的各項指標&#xff08;如產量、次品率&#xff09;。這些設備…

Linux系統磁盤未分配的空間釋放并分配給 / 根目錄的詳細操作【openEuler系統】

選擇 Fix 修正 GPT 表 輸入 Fix 并按回車&#xff0c;parted 會自動&#xff1a; 擴展 GPT 表的 結束位置 到磁盤末尾。釋放未被使用的空間&#xff08;1048576000 個 512B 塊&#xff0c;約 500GB&#xff09;。 驗證修正結果 修正后&#xff0c;再次運行&#xff1a; parted …

王道考研-數據結構-01

數據結構-01視頻鏈接&#xff1a;https://www.bilibili.com/video/BV1b7411N798?spm_id_from333.788.videopod.sections&vd_source940d88d085dc79e5d2d1c6c13ec7caf7&p2 數據結構到底在學什么? 數據結構這門課他要學習的就是怎么用程序代碼把現實世界的問題給信息化&…

k8s云原生rook-ceph pvc快照與恢復(上)

#作者&#xff1a;Unstopabler 文章目錄前言部署rook-ceph on kubernets條件Ceph快照概述什么是PVC安裝快照控制器和CRD1.安裝crds資源2.安裝控制器3.安裝快照類前言 Rook 是一個開源的云原生存儲編排器&#xff0c;為各種存儲解決方案提供平臺、框架和支持&#xff0c;以便與…

springcloud04——網關gateway、熔斷器 sentinel

目錄 注冊中心 nacos | eurekaServer |zookeeper(dubbo) 配置中心 nacos | config Server 遠程服務調用 httpClient | RestTemplate | OpenFeign 負載均衡服務 ribbon | loadbalancer 網關 zuul | gateway 熔斷器 hystrix | sentinel 網關 sentinel 流控 壓測工具 1…

XSS跨站腳本攻擊詳解

一、XSS攻擊簡介跨站腳本攻擊的英文全稱是Cross-Site Scripting&#xff0c;為了與CSS有所區別&#xff0c;因此縮寫為“XSS”由于同源策略的存在&#xff0c;攻擊者或者惡意網站的JavaScript代碼沒有辦法直接獲取用戶在其它網站的信息&#xff0c;但是如果攻擊者有辦法把惡意的…

Linux /proc/目錄詳解

文章目錄前言文件說明注意事項前言 在 Linux 系統中&#xff0c;/proc 目錄是一個特殊的虛擬文件系統&#xff0c;它提供了對系統內核和進程的訪問。/proc 目錄中的文件和目錄不是真實存在的&#xff0c;它們是在運行時由內核動態生成的&#xff0c;用于提供系統和進程的相關信…

北斗變形監測在地質災害監測中的應用

內容概要 北斗形變監測系統在地質災害監測領域發揮著核心作用&#xff0c;該系統基于北斗衛星導航技術&#xff0c;實現對地表變形的精確追蹤。通過毫米級精度定位能力&#xff0c;北斗形變監測技術為滑坡等災害提供關鍵數據支撐&#xff0c;尤其在偏遠地區應用中&#xff0c;單…

2025新征程杯全國54校園足球錦標賽在北京世園公園隆重開幕

2025年8月1日&#xff0c;備受矚目的2025新征程杯全國54校園足球錦標賽&#xff08;北京&#xff09;在北京世園公園盛大拉開帷幕。開幕式上&#xff0c;中國關心下一代健康體育基金會副秘書長、中國青少年研究會理事、全國 54 校園足球人才培養計劃創始人何占強主任表示&#…

分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測

分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測 目錄分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測分類效果基本介紹程序設計分類效果 基本介紹 1.Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測&#xff0c;運…

機器學習——邏輯回歸(LogisticRegression)的核心參數:以約會數據集為例

理解 LogisticRegression 的核心參數&#xff1a;以約會數據集為例 邏輯回歸&#xff08;Logistic Regression&#xff09;是機器學習中一種基礎且重要的分類算法&#xff0c;特別適用于解決二分類和多分類問題。本文將基于 sklearn.linear_model.LogisticRegression 的用法&a…

深入解析 Apache Flink FLIP-511:優化 Kafka Sink 事務處理,減輕 Broker 負載

一、 背景與核心問題&#xff1a;Kafka Sink 事務的痛點 Flink Kafka Sink 在 Exactly-Once 模式下依賴 Kafka 事務來確保數據寫入的原子性&#xff0c;并與 Flink 檢查點對齊。然而&#xff0c;非優雅關閉&#xff08;如任務失敗、非 stop-with-savepoint 的停止&#xff09;會…

設計模式:組合模式 Composite

目錄前言問題解決方案結構代碼前言 組合是一種結構型設計模式&#xff0c;你可以使用它將對象組合成樹狀結構&#xff0c;并且能像使用獨立對象一樣使用它們。 問題 如果應用的核心模型能用樹狀結構表示&#xff0c; 在應用中使用組合模式才有價值。 例如&#xff0c; 你有兩…

嵌入式 C 語言入門:函數封裝與參數傳遞學習筆記 —— 從定義到內存機制

前言 大家好&#xff0c;這里是 Hello_Embed。在前一篇筆記中&#xff0c;我們用循環實現了 LED 閃爍&#xff0c;其中重復使用了兩段幾乎一樣的延時代碼&#xff1a; for(i 0; i < 100000000; i); // 延時這種重復不僅讓代碼冗余&#xff0c;還不利于后續修改&#xff08…

第一個大語言模型的微調

模型推理 現在,我們的模型應該能夠針對輸入的任何短句生成類似尤達大師風格的句子作為回應。 該模型要求其輸入格式規范。我們需要構建一個 “消息” 列表 —— 在這個案例中,就是來自用戶的消息 —— 并通過提示表明輪到模型進行輸出,以促使其做出回答。 add_generation…

Linux內核驅動開發核心問題全解

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry Linux內核驅動開發核心問題全解 本文系統梳理了 Linux 驅動開發、內核同步、中斷處理、內存管理、進程通信、系統啟動等典型…

【C++篇】C++11入門:踏入C++新世界的大門

文章目錄C11簡介列表初始化1. {}初始化2. initializer_list容器initializer_list的使用場景聲明1. auto2. decltype3. nullptrSTL中的變化1. 新容器array容器forward_list容器unordered_map和unordered_set容器2. 新接口C11簡介 C98/03&#xff1a;在2003年C標準委員會曾經提交…

Java 日期時間處理:分類、用途與性能分析

Java提供了多種日期時間處理API&#xff0c;隨著版本演進不斷改進。以下是主要日期時間類的分類、用途和性能分析&#xff1a;一、Java日期時間API分類1. 傳統日期時間API (Java 1.0/1.1)java.util.Date - 表示特定的瞬間&#xff0c;精確到毫秒java.util.Calendar - 抽象類&am…

[Linux]學習筆記系列 --GCC

文章目錄屬性__cleanup__attribute_malloc__ 用于標記函數返回一個新分配的內存塊__attribute_alloc_size__ 用于指定分配的內存大小__attribute__((const)) 標記為純函數(pure function)__attribute__((__externally_visible__)) 使其在編譯器優化過程中保持對外部模塊的可見性…