9.MySQL 索引

目錄

???????概述

概念:

單列索引

普通索引

創建索引

查看索引

刪除索引

唯一索引

創建唯一索引

刪除唯一索引

主鍵索引

組合索引

創建索引

全文索引

概述

使用全文索引

空間索引

內部原理

相關算法:

hash算法

二叉樹算法

平衡二叉樹

?Btree樹算法

MylSAM引擎使用B+Tree

InnoDB引擎使用B+Tree

特點總結

優點

缺點

使用原則


概述

概念:

  • 索引是通過某種算法,構建出一個數據模型,用于快速找出在某個列中有一特定值的行,不使用索引,MySQL必須從第一條記錄開始讀完整個表,直到找出相關的行,表越大,查詢數據所花費的時間就越多,如果表中查詢的列有一個索引,MySQL能夠快速到達一個位置去搜索數據文件,而不必查看所有數據,那么將會節省很大一部分時間。
  • 索引類似一本書的目錄,比如要查找'student'這個單詞,可以先找到s開頭的頁然后向后查找,這個就類似索引。
    ?
  • 按照實現方式可以分為hash索引、B+tree索引

單列索引

單列索引:一個索引只包含單個列,但一個表中可以有多個單列索引;
?

普通索引

普通索引:MySQL中基本索引類型,沒有什么限制,允許在定義索引的列中插入重復值和空值,純粹為了查詢數據更快一點。

創建索引

-- 方式1 創建表的時候直接指定
create table student(sid int primary key,card_id varchar(20),name varchar (20),gender varchar (20),age int,birth date,phone_num varchar(20),score double,index index_name(name) -- 給name列創建索引
)-- 方式2 直接創建
create index index_gender on student(gender);-- 方式3 修改表結構(添加索引)
alter table student add index index_age(age);

查看索引

-- 1、查看數據庫所有索引
-- select * from mysql.innodb_index_stats a where  a.database_name = '數據庫名' 
select * from mysql.innodb_index_stats a where  a.database_name = 'mydb2';-- 2、查看表中所有索引
-- select * from mysql.innodb_index_stats a where  a.database_name = '數據庫名' and a.table_name like '%表名%';
select * from mysql.innodb_index_stats a where  a.database_name = 'mydb2' and a.table_name like '%student%';-- 3、查看表中所有索引
-- show index from 表名
show index from student;

刪除索引

-- 刪除索引
drop index index_name on student;alter table student drop index index_gender; 

唯一索引

  • 唯一索引與前面的普通索引類似,不同的就是:
  • 索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創建方式:

創建唯一索引

刪除唯一索引

主鍵索引

  • 每張表一般都會有自己的主鍵,當我們在創建表時,MySQL會自動在主鍵列上建立一個索引,這就是主鍵索引。主鍵是具有唯一性并且不允許為NULL,所以他是一種特殊的唯一索引

組合索引

  • 組合索引也叫復合索引,指的是我們在建立索引的時候使用多個字段,例如同時使用身份證和手機號建立索引,同樣的可以建立為普通索引或者是唯一索引。
  • 復合索引的使用復合最左原則。

創建索引

-- 組合索引
create index index_phone_name on student(phone_num,name);-- 刪除索引
drop index index_phone_name on student;

全文索引

概述

  • 全文索引的關鍵字是fulltext
  • 全文索引主要用來查找文本中的關鍵字,而不是直接與索引中的值相比較,它更像是一個搜索引擎,基于相似度的查詢,而不是簡單的where語句的參數匹配。
  • like +%就可以實現模糊匹配了,為什么還要全文索引? like +%在文本比較少時是合適的,但是對于大量的文本數據檢索,是不可想象的。全文索引在大量的數據面前,能比 like +%快N倍,速度不是一個數量級,但是全文索引可能存在精度問題。
  • 只有字段的數據類型為char、varchar、text及其系列才可以建全文索引;
  • 在數據量較大時候,現將數據放入一個沒有全局索引的表中,然后再用create index創建fultext索引,要比先為一張表建立fulltext然后再將數據寫入的速度快很多
  • 測試或使用全文索引時,要先看一下自己的MysQL版本、存儲引擎和數據類型是否支持全文索引。
  • MySQL中的全文索引,有兩個變量,最小搜索長度最大搜索長度,對于長度小于最小搜索長度和大于最大搜索長度的詞語,都不會被索引。通俗點就是說,想對一個詞語使用全文索引搜索,那么這個詞語的長度必須在以上兩個變量的區間內。這兩個的默認值可以使用以下命令查看:?show variables like '%ft%'

使用全文索引

create table  t_article(id int primary key auto_increment,title varchar(255),content varchar(1000),writing_data date-- fulltext(content)  可以在這里創建全文索引,但是效率比較低 
)insert into t_article values(null, "Yesterday Once NMore","when 1 was young 1 listen to the radi " , '2021-10-01');
insert into t_article values(null, "Right Here waiting" ,'oceans apart,day after day,and I slowly go insane',' 2021-10-02' );
insert into t_article values(null, "ly Heart will Go on", " every night in my dreams,i see you, i feel you",' 2021-10-03');
insert into t_article values(null, 'Everything I Do',' eLook into my eyes , vou will see what you mean to me' , '2021-10-04')
insert into t_article values(null, "called To Say I Love you","say love you no new yean 's day,to celebrate" ,'2021-10-05');
insert into t_article values(null, "Nothing s Gonna Change Ny Love For You","if i had to live my life without you nearme"," 2021-10-06");
insert into t_article values(null, "Everybody", "we 're gonna bring the flavor show U how." , '221-10-07');-- 修改表結構
alter table t_article add fulltext index_content(content);-- 添加全文索引
create fulltext index index_content on t_article(content);-- 使用全文索引
select * from t_article where match(content) against('you') -- 有結果select * from t_article where match(content) against('yo') -- 沒結果select * from t_article where content like '%you%';

空間索引

  • MySQL在5.7之后的版本支持了空間索引,而且支持OpenGIs幾何數據模型
  • 空間索引是對空間數據類型的字段建立的索引,MYSQL中的空間數據類型有4種,分別是GEOMETRY、POINT、LINESTRING、POLYGON。
  • MYSQL使用SPATIAL關鍵字進行擴展,使得能夠用于創建正規索引類型的語法創建空間索引。創建空間索引的列,必須將其聲明為NOT NULL。
  • 空間索引一般是用的比較少,了解即可。
    ?

內部原理

  1. 一般來說,索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲的磁盤上這樣的話,索引查找過程中就要產生磁盤I/O消耗,相對于內存存取,I/O存取的消耗要高幾個數量級,所以評價一個數據結構作為索引的優劣最重要的指標就是在查找過程中磁盤I/O操作次數的漸進復雜度。
  2. 換句話說,索引的結構組織要盡量減少查找過程中磁盤I/O的存取次數。

相關算法:

hash算法

二叉樹算法

平衡二叉樹

?Btree樹算法

MylSAM引擎使用B+Tree

InnoDB引擎使用B+Tree

特點總結

優點

  1. ·大大加快數據的查詢速度
  2. ·使用分組和排序進行數據查詢時,可以顯著減少查詢時分組和排序的時間·創建唯一索引,能夠保證數據庫表中每一行數據的唯一性
  3. ·在實現數據的參考完整性方面,可以加速表和表之間的連接

缺點

  1. ·創建索引和維護索引需要消耗時間,并且隨著數據量的增加,時間也會增加
  2. ·索引需要占據磁盤空間
  3. ·對數據表中的數據進行增加,修改,刪除時,索引也要動態的維護,降低了維護的速度

使用原則

  1. 更新頻繁的列不應設置索引
  2. 數據量小的表不要使用索引(畢竟總共2頁的文檔,還要目錄嗎? )
  3. 重復數據多的字段不應設為索引(比如性別.只右里和女,一般來說:重復的數據超過百分之15就不該建索引)
  4. 首先應該考慮對 where 和 order by 涉及的列上建立索引

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

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

相關文章

Spring基于XML文件配置AOP

AOP AOP,面向切面編程,是對面向對象編程OOP的升華。OOP是縱向對一個事物的抽象,一個對象包括靜態的屬性信息,包括動態的方法信息等。而AOP是橫向的對不同事物的抽象,屬性與屬性、方法與方法、對象與對象都可以組成一個…

12.10多種編碼方式,編碼方案選擇策略(遞歸級聯),PDE,RLE代碼

作者如何選擇和設計編碼方案,以實現高效的解壓縮和高壓縮比?BtrBlocks是否適用于所有類型的數據? 選擇和設計編碼方案: 結合多種高效編碼方案:BtrBlocks 通過選擇一組針對不同數據分布的高效編碼方案,實現…

js判斷是否對象自身為空

文章目錄 一、前言二、JSON.stringify三、for in 配合 hasOwnProperty四、Object.keys五、Object.getOwnPropertyNames六、Object.getOwnPropertyNames 結合 Object.getOwnPropertySymbols七、Reflect.ownKeys八、最后 一、前言 如何判斷一個對象為空? 先上結論&a…

MySql復習筆記03(小滴課堂) 事務,視圖,觸發器,存儲過程

mysql 必備核心知識之事務的詳細解析: 創建一個數據庫表: 添加數據并開啟事務。 添加數據并查詢。 登錄另一臺服務器發現查不到這個表中的數據。 這是因為事務開啟了,但是沒有提交,只是把數據存到了內存中,還沒有寫入…

以為回調函數是同步的(js的問題)

回調函數可以用來處理 JavaScript 的異步操作,但是選用 Promise、async/await 更好,因為多重回調函數會導致回調地獄。 回調函數不是**同步的**,它是延時操作執行完畢后會被調用的一個函數。 比如全局方法 "setTimeout" &#xf…

CString 的 Replace 函數

Replace 使用測試 CString mSectNameNew L"槽a*b*c*d";CString mSectNameNew2 L"Ca*b*c*d";CString mSectNameNew3 L"[a*b*c*d";mSectNameNew.Replace(_T("M"), _T("C")); // 不會替換mSectNameNew.Re…

JOSEF 沖擊繼電器 ZC-23A DC48V 柜內安裝,板前帶座

系列型號 ZC-23沖擊繼電器;ZC-23A沖擊繼電器; ZC-23B沖擊繼電器 一、用途 沖擊繼電器ZC-23A DC48V 柜內安裝板前帶座 (以下簡稱繼電器),廣泛用于直流操作的繼電器保護及自動控制回路中,作為集中控制信號元件。 二、主要技術參…

C#動態調用C++DLL中的函數

DLL中導出的函數 typedef void (*HQ_MSG_CALLBACK)(void *h, int nMsg, int nMsgType, int nReqNo, const char *szData, int nSize); void SetMsgFunc(void *h, HQ_MSG_CALLBACK pmsgCallBack);C#動態調用上述函數 public delegate void CALLBACK(IntPtr h, int nMsg, int n…

信息處理技術員

目錄 信息處理技術員工作內容 信息處理技術員崗位面試試題舉例 信息處理技術員考試 信息處理技術員工作內容 信息處理技術員是負責處理和管理信息系統的專業人員。他們的主要工作內容包括以下幾個方面: 1.系統維護和管理:信息處理技術員負責維護和管…

大數據股票簡單分析

目錄標題 內容說明解題量化金融的含義量化交易策略 點擊直接資料領取 內容 1解釋量化金融的含義,調研并給出至少 5種量化交易的策略或方法 2.完成Tushare Pro 的安裝、注冊,獲取自己的 Token,查閱網站內的接口講解和示例; 3通過Python 編程完…

力扣刷題總結 字符串(2)【KMP】

🔥博客主頁: A_SHOWY🎥系列專欄:力扣刷題總結錄 數據結構 云計算 數字圖像處理 28.找出字符串中第一個匹配項的下標mid經典KMP4593重復的子字符串mid可以使用滑動窗口或者KMP KMP章節難度較大,需要深入理解其中…

Flink 本地單機/Standalone集群/YARN模式集群搭建

準備工作 本文簡述Flink在Linux中安裝步驟,和示例程序的運行。需要安裝JDK1.8及以上版本。 下載地址:下載Flink的二進制包 點進去后,選擇如下鏈接: 解壓flink-1.10.1-bin-scala_2.12.tgz,我這里解壓到soft目錄 [ro…

OrangePi ZERO2 刷機與啟動

鏡像準備 用讀卡器和Win32Diskimager刷寫鏡像到內存卡,鏡像文件見下面百度云鏈接:https://pan.baidu.com/s/14aKTznc4Jvw4SoFF54JUTg 提取碼:1815 刷寫完畢后插回香橙派 串口登錄 用MobaXterm和USB-TTL進行串口登錄,MobaXterm軟…

談一談網絡協議中的應用層

文章目錄 一,什么是HTTPHTTP的優缺點HTTPS 一,什么是HTTP 我們在通過網絡進行傳輸數據時,我們要保證,我們在發送時構造的數據,在接收時也能夠解析出來,這本質上就是一種協議,是一種應用層協議&…

Spring Cloud + Vue前后端分離-第3章 SpringBoot項目技術整合

Spring Cloud Vue前后端分離-第3章 SpringBoot項目技術整合 3-1 集成持久層框架Mybatis ORM:對象關系映射,Hibernate是全自動ORM,Mybatis是半自動ORM,Mybatis可以操作的花樣更多,是首選的持久層框架 System模塊集成Mybatis框架…

整數分析 C語言xdoj43

問題描述 給出一個整數n&#xff08;0<n<100000000&#xff09;。求出該整數的位數&#xff0c;以及組成該整數的所有數字中的最大數字和最小數字。 輸入說明 輸入一個整數n&#xff08;0<n<100000000&#xff09; 輸出說明 在一行上依次輸出整數n的位…

Linux內核上游提交完整流程及示例

參考博客文章&#xff1a; 向linux內核提交代碼 - 知乎 一、下載Linux內核源碼 通過git下載Linux內核源碼&#xff0c;具體命令如下&#xff1a; git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 實際命令及結果如下&#xff1a; penghaoDin…

IBM Qiskit量子機器學習速成(六)

量子卷積神經網絡 卷積和池化&#xff1a;卷積神經網絡的必備成分 卷積神經網絡被廣泛應用于圖像和音頻的識別當中&#xff0c;關鍵在于“卷積”操作賦予神經網絡統籌學習數據的能力。 執行卷積操作需要輸入數據與卷積核&#xff0c;卷積核首先與輸入數據左上角對齊&#xf…

【數據庫】簡單連接嵌套查詢

目錄 &#x1f387;簡單查詢 &#x1f387;連接查詢 &#x1f387;嵌套查詢 分析&思考 &#x1f387;簡單查詢 --練習簡單查詢 --select * from classes --select * from student --select * from scores --1.按Schedule表的結構要求用SQL語言創建Schedule表 --字段名…

深度學習之全面了解預訓練模型

在本專欄中&#xff0c;我們將討論預訓練模型。有很多模型可供選擇&#xff0c;因此也有很多考慮事項。 這次的專欄與以往稍有不同。我要回答的問題全部源于 MathWorks 社區論壇&#xff08;ww2.mathworks.cn/matlabcentral/&#xff09;的問題。我會首先總結 MATLAB Answers …