MySQL索引教程(01):創建索引

文章目錄

  • MySQL 創建索引
  • 索引介紹
  • MySQL CREATE INDEX 語法
  • MySQL 索引類型
  • MySQL `CREATE INDEX` 實例
  • 結論

MySQL 創建索引

對于一個具有大量數據行的表,如果你根據某個查詢條件檢索數據時很慢,可能是因為你沒有在檢索條件相關的列上創建索引。

索引類似于詞典中的目錄。如果您想要在詞典中查詢一個詞,正確的做法是先查看目錄,再根據目錄中的指示到指定的頁面找到相關的詞。正確的索引可以顯著提高從數據庫表中檢索數據行的速度。

MySQL 允許您使用 CREATE INDEX 語句在指定的表上為指定的列創建索引。

索引介紹

索引是一種數據結構,例如 B-Tree,它提高了從表中檢索數據行的速度,但需要額外的寫入和存儲來維護它。

查詢優化器可以使用索引來快速定位數據,而不必針對給定查詢掃描表中的每一行。

當您使用主鍵 或唯一鍵創建表時,MySQL 會自動創建一個名為 PRIMARY 的索引。 該索引稱為聚集索引。

PRIMARY 索引是特殊的,因為索引本身與數據一起存儲在同一個表中。聚集索引強制執行表中行的順序。

PRIMARY 索引以外的其他索引稱為二級索引或非聚集索引。

MySQL CREATE INDEX 語法

您應該按照如下的語法使用 CREATE INDEX 為一個表添加一個索引:

CREATE [UNIQUE] INDEX index_name
[USING {BTREE | HASH}]
ON table_name (column_list)
[algorithm_option | lock_option];

這里,

  • UNIQUE 關鍵字表明此索引為唯一索引。它是可選的。
  • index_name 是索引的名字。一個表中不應該出現兩個相同名字的索引。
  • table_name 是表的名字。
  • column_list 是表中的列名。多個列名使用逗號分隔。
  • USING 子句指定索引的類型。可選值:BTREE,HASH。 它是可選的。
  • algorithm_option 指定刪除索引的算法。它使用以下的語法:
ALGORITHM [=] {DEFAULT | INPLACE | COPY}

ALGORITHM 子句是可選的。默認為 INSTANT。如果不支持 INSTANT,則使用 INPLACE。

使用 DEFAULT 和省略 ALGORITHM 子句效果相同。

以下是對各個算法的說明:

  • COPY:對原表的副本進行操作,將原表中的表數據逐行復制到新表中。
  • 不允許并發 DML。
  • INPLACE: 操作避免復制表數據,但可能會就地重建表。在操作的準備和執行階段,可能會短暫地對表進行獨占元數據鎖定。通常,支持并發 DML。
  • INSTANT: 操作只修改數據字典中的元數據。在操作的執行階段,可能會短暫地對表進行獨占元數據鎖定。表數據不受影響,使操作瞬間完成。允許并發 DML。(在 MySQL 8.0.12 中引入)

lock_option 指定刪除索引的并發控制策略。它使用以下的語法:

LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}

LOCK 子句是可選的。以下是對各個并發策略的說明:

DEFAULT
給定 ALGORITHM 子句(如果有)和 ALTER TABLE 操作的最大并發級別:如果支持,則允許并發讀取和寫入。如果不是,則允許并發讀取(如果支持)。如果不是,則強制執行獨占訪問。
NONE
如果支持,允許并發讀取和寫入。否則,會發生錯誤。
SHARED
如果支持,允許并發讀取但阻止寫入。即使存儲引擎支持給定 ALGORITHM 子句(如果有)和 ALTER TABLE 操作的并發寫入,寫入也會被阻止。如果不支持并發讀取,則會發生錯誤。
EXCLUSIVE
強制執行獨占訪問。即使存儲引擎支持給定 ALGORITHM 子句(如果有)和 ALTER TABLE 操作的并發讀/寫,也會這樣做。
在 MySQL 內部,CREATE INDEX 語句被映射為 ALTER TABLE … ADD INDEX … 語句。

MySQL 索引類型

默認情況下,如果您不指定索引類型,MySQL 將創建 B-Tree 索引。下面顯示了基于表的存儲引擎允許的索引類型:
在這里插入圖片描述

MySQL CREATE INDEX 實例

在以下實例中,我們使用students表進行演示。

創建students表,并添加數據

CREATE TABLE `students`  (`student_id` int(11) NULL DEFAULT NULL,`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,`age` int(11) NULL DEFAULT NULL,INDEX `age`(`age` ASC) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = DYNAMIC;-- ----------------------------
-- Records of students
-- ----------------------------
INSERT INTO `students` VALUES (1, '安靖', 18);
INSERT INTO `students` VALUES (2, '平安', 19);
INSERT INTO `students` VALUES (3, '總結', 20);
INSERT INTO `students` VALUES (3, '周杰倫', 18);
INSERT INTO `students` VALUES (4, '張三', 18);
INSERT INTO `students` VALUES (5, '李四', 18);
INSERT INTO `students` VALUES (6, '鐘意', 19);
INSERT INTO `students` VALUES (7, '張宇', 18);
INSERT INTO `students` VALUES (8, '劉浪', 18);

以下語句查找年齡等于18的學生信息:

SELECT * FROM students WHERE age = 18;

查詢結果如下:

在這里插入圖片描述

您可以是使用 EXPLAIN 來查看以上 SELECT 語句的語句的執行計劃,以了解 MySQL 在內部如何執行此查詢,如下所示:

EXPLAIN SELECT * FROM students WHERE age = 18;

在這里插入圖片描述
如您所見,MySQL 必須掃描由9行組成的整個表才能找到具有符合條件的行。

現在,使用以下 CREATE INDEX 語句為該列 age 創建索引 :

 CREATE INDEX age ON students(age);

創建結果:
在這里插入圖片描述

要查看索引是否創建成功,請使用以下 SHOW INDEXES 語句顯示表 actor 的索引,例如:

SHOW INDEXES FROM students;

查詢結果

在這里插入圖片描述

然后,再次執行上面的 EXPLAIN 語句:

EXPLAIN SELECT * FROM students WHERE age = 18;

查詢結果如下:

在這里插入圖片描述
如您所見,MySQL 只需從 age 指示的索引中定位其中的 6 行, 而無需掃描整個表。所以會提高查詢速度。

結論

在 MySQL 中,索引能提高從表中查詢數據的效率。您可以使用 CREATE INDEX 為表創建索引。

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

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

相關文章

FPC生產工藝全流程詳解

FPC生產制作繁瑣而且難度較大,與普通PCB比較,FPC單位面積電路的造價高很多,但是,由于FPC優異的柔性、輕薄和可靠性等特性,給眾多領域的設備和產品提供了更廣泛的實現空間和新的設計方案,比如沉金板在電子、…

android的activty冷啟動和熱啟動差異是什么?

Android的Activity冷啟動和熱啟動之間存在顯著差異,這些差異主要體現在啟動過程、資源加載、組件初始化以及用戶體驗等方面。以下是對兩者差異的詳細分析: 一、定義與過程差異 冷啟動: 定義:冷啟動是指應用程序完全退出后&#…

Java需要英語基礎嗎?

Java編程語言本身并不要求必須有很強的英語基礎,因為Java的語法和邏輯是獨立于任何特定語言的。我收集歸類了一份嵌入式學習包,對于新手而言簡直不要太棒,里面包括了新手各個時期的學習方向編程教學、問題視頻講解、畢設800套和語言類教學&am…

android開發引入jar包

我在為一個安卓設備開發一個APP,設備的廠家給我提供了一個jar包,我應該如何把它引入到項目之中呢? 很慚愧我以前幾乎沒做過android的開發,在此之前這么一個簡單的問題也不會。 實踐 我隨手在Android studio中新建了一個項目。 你…

Java項目:基于SSM框架實現的共享客棧管理系統分前后臺【ssm+B/S架構+源碼+數據庫+畢業論文】

一、項目簡介 本項目是一套基于SSM框架實現的共享客棧管理系統 包含:項目源碼、數據庫腳本等,該項目附帶全部源碼可作為畢設使用。 項目都經過嚴格調試,eclipse或者idea 確保可以運行! 該系統功能完善、界面美觀、操作簡單、功能…

Splunk Enterprise for Windows 未授權任意文件讀取漏洞復現(CVE-2024-36991)

0x01 產品簡介 Splunk Enterprise是一款功能強大的數據分析引擎,旨在從所有IT系統和基礎設施數據中提供數據搜索、報表和可視化展現。Splunk Enterprise能夠收集、索引和利用所有應用程序、服務器和設備(包括物理、虛擬和云中環境)生成的快速移動型計算機數據。它允許用戶從…

交易積累-比特幣

在某些情況下,由于監管限制或個人選擇,投資者可能會考慮購買與比特幣相關的替代投資產品,如比特幣礦業公司股票(例如Marathon Digital Holdings, Inc.,股票代碼:MARA)或加密貨幣交易平臺的股票&…

使用maven搭建一個SpingBoot項目

1.首先創建一個maven項目 注意選擇合適的jdk版本 2.添加依賴 2.在pom.xml中至少添加依賴 spring-boot-starter-web 依賴&#xff0c;目的是引入Tomcat&#xff0c;以及SpringMVC等&#xff0c;使項目具有web功能。 <!-- 引入 包含tomcat&#xff0c;SpringMVC&#xff0c…

【C++題解】1561. 買木頭

問題&#xff1a;1561. 買木頭 類型&#xff1a;省賽、數組問題、二分答案、貪心、2015江蘇省青少年信息學奧林匹克競賽復賽 題目描述&#xff1a; 有 n 個木材供應商&#xff0c;每個供貨商有長度相同一定數量的木頭。長木頭可以鋸短&#xff0c;但短木頭不能接長。有一個客…

web前端之上傳文件夾、webkitdirectory

MENU 前言element-ui寫法input寫法 前言 1、以下代碼只實現的單個文件夾的上傳&#xff0c;原本需求是實現選擇多個文件夾上傳&#xff0c;但是沒找到實現的方法。如果想實現多個文件夾上傳&#xff0c;可以給這些文件夾新建一個父級文件夾&#xff0c;點擊上傳的時候選擇父級文…

14-36 劍和詩人10 - 用LLM構建 AI 代理平臺

介紹 在當今快速發展的技術環境中&#xff0c;大型語言模型 (LLM) 和 AI 代理正在改變我們與信息交互、實現流程自動化以及應對不同行業復雜挑戰的方式。隨著這些強大的模型不斷發展&#xff0c;對能夠無縫集成和協調它們的強大平臺的需求變得越來越重要。 讓我們深入研究設計…

android2024 gradle8 Processor和ksp兩種編譯時注解實現

android編譯時注解&#xff0c;老生常談&#xff0c;外面的例子都是bindView&#xff0c;腦殼看疼了&#xff0c;自己學習和編寫下。 而且現在已經進化到kotlin2.0&#xff0c;google也逐漸放棄kapt&#xff0c;進入維護狀態。所以要好好看看本貼。 參考我的工程&#xff1a; h…

數據結構之算法的時間復雜度

1.時間復雜度的定義 在計算機科學中&#xff0c;算法的時間復雜度是一個函數&#xff0c;它定量描述了算法的運行時間。一個算法所花費的時間與其中語句的執行次數成正比列&#xff0c;算法中的基本操作的執行次數&#xff0c;為算法的時間復雜度 例1&#xff1a; 計算Func1…

Linux:ollama大模型部署

目錄 Ollama 是一個能在本地機器上輕松構建和運行大型語言模型的輕量級、可擴展框架&#xff0c;適用于多種場景&#xff0c;具有易于使用、資源占用少、可擴展性強等特點。 1.安裝下載ollama 2.為 Ollama 創建一個用戶 3.為ollama創建服務文件 4.啟動ollama服務 5.拉取語…

Java 家庭物聯網

家庭物聯網系統的代碼和說明&#xff0c;包括用戶認證、設備控制、數據監控、通知和警報、日志記錄以及WebSocket實時更新功能。 ### 項目結構 plaintext home-iot-system ├── backend │ └── src │ └── main │ └── java │ └…

圖書館數據倉庫

目錄 1.數據倉庫的數據來源為業務數據庫&#xff08;mysql&#xff09; 初始化腳本 init_book_result.sql 2.通過sqoop將mysql中的業務數據導入到大數據平臺&#xff08;hive&#xff09; 導入mysql數據到hive中 3.通過hive進行數據計算和數據分析 形成數據報表 4.再通過sq…

【matlab】智能優化算法——求解目標函數

智能優化算法在求解目標函數方面發揮著重要作用&#xff0c;它通過迭代、篩選等方法來尋找目標函數的最優值&#xff08;極值&#xff09;。以下是關于智能優化算法求解目標函數的詳細介紹&#xff1a; 一、智能優化算法概述 智能優化算法是一種搜索算法&#xff0c;旨在通過…

設置單實例Apache HTTP服務器

配置倉庫 [rootlocalhost ~]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vi rpm.repo倉庫代碼&#xff1a; [BaseOS] nameBaseOS baseurl/mnt/BaseOS enabled1 gpgcheck0[AppStream] nameAppStream baseurl/mnt/AppStream enabled1 gpgcheck0掛載 [rootlocalhost …

2.4G無線收發芯片 XL2401D,SOP16封裝,集成單片機,高性價比

XL2401D 芯片是工作在2.400~2.483GHz世界通用ISM頻段&#xff0c;片內集成了九齊 NY8A054E單片機的SOC無線收發芯片。芯片集成射頻收發機、頻率收生器、晶體振蕩器、調制解調器等功能模塊&#xff0c;并且支持一對多組網和帶ACK的通信模式。發射輸出功率、工作頻道以及通信數據…

網絡基礎:IS-IS協議

IS-IS&#xff08;Intermediate System to Intermediate System&#xff09;是一種鏈路狀態路由協議&#xff0c;最初由 ISO&#xff08;International Organization for Standardization&#xff09;為 CLNS&#xff08;Connectionless Network Service&#xff09;網絡設計。…