国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一文搞懂 MySQL 索引

這篇具有很好參考價值的文章主要介紹了一文搞懂 MySQL 索引。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一文搞懂 MySQL 索引



1、MySQL 索引 簡介

1.1、MySQL 索引 是什么?

?索引是一個單獨的、存儲在 磁盤 上的 數(shù)據(jù)庫結(jié)構(gòu) ,包含著對數(shù)據(jù)表里 所有記錄的 引用指針。


1.2、 MySQL 索引 的存儲類型有哪些?

?MySQL中索引的存儲類型有兩種,即 BTree 和 Hash。


1.3、MySQL 索引 在哪里實現(xiàn)的?

?索引是在存儲引擎中實現(xiàn)的。(MySQL 的存儲引擎有:InnoDB、MyISAM、Memory、Heap)

  • InnoDB / MyISAM 只支持 BTree 索引
  • Memory / Heap 都支持 BTree 和 Hash 索引

1.4、存儲引擎 是什么?

?存儲引擎就是指 表的類型 以及 表在計算機上的存儲方式。


1.5、索引 的優(yōu)缺點有哪些?

優(yōu)點:

  • 提高數(shù)據(jù)的查詢的效率(類似于書的目錄)
  • 可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性(唯一索引)
  • 減少分組和排序的時間(使用分組和排序子句進行數(shù)據(jù)查詢)
    • 被索引的列會自動進行分組和排序

缺點:

  • 占用磁盤空間
  • 降低更新表的效率(不僅要更新表中的數(shù)據(jù),還要更新相對應(yīng)的索引文件)


2、MYSQL 索引 的分類

1、普通索引 和 唯一索引

  • 普通索引:MySQL 中的基本索引類型,允許在定義索引的列中插入 重復(fù)值 和 空值

  • 唯一索引:要求索引列的值必須 唯一,但允許 有空值

    • 如果是組合索引,則列值的組合必須 唯一
    • 主鍵索引是一種特殊的唯一索引,不允許 有空值

2、單列索引 和 組合索引

  • 單列索引:一個索引只包含單個列,一個表可以有多個單列索引
  • 組合索引:在表的 多個字段 組合上 創(chuàng)建的 索引
    • 只有在查詢條件中使用了這些字段的 左邊字段 時,索引才會被使用(最左前綴原則)

3、全文索引

  • 全文索引 的類型為 fulltext
  • 在定義索引的 列上 支持值的全文查找,允許在這些索引列中插入 重復(fù)值 和 空值
  • 全文索引 可以在 char、varchar 和 text 類型的 列 上創(chuàng)建

4、空間索引

  • 空間索引 是對 空間數(shù)據(jù)類型 的字段 建立的索引

  • MySQL中的空間數(shù)據(jù)類型有4種,分別是 Geometry、Point、Linestring 和 Polygon

  • MySQL 使用 Spatial 關(guān)鍵字進行擴展,使得能夠用創(chuàng)建正規(guī)索引類似的語法創(chuàng)建空間索引

  • 創(chuàng)建空間索引的列,不允許為空值,且只能在 MyISAM 的表中創(chuàng)建。

5、前綴索引

  • 在 char、varchar 和 text 類型的 列 上創(chuàng)建索引時,可以指定索引 列的長度


3、MySQL 索引 的數(shù)據(jù)結(jié)構(gòu)

?MySQL 索引 的數(shù)據(jù)結(jié)構(gòu)可以分為 BTree 和 Hash 兩種,BTree 又可分為 BTree 和 B+Tree。


Hash:使用 Hash 表存儲數(shù)據(jù),Key 存儲索引列,Value 存儲行記錄或行磁盤地址。

?Hash 只支持等值查詢(“=”,“IN”,“<=>”),不支持任何范圍查詢(原因在于 Hash 的每個鍵之間沒有任何的聯(lián)系),Hash 的查詢效率很高,時間復(fù)雜度為 O(1)。


BTree:屬于多叉樹,又名多路平衡查找樹。

性質(zhì):

  • BTree 的節(jié)點存儲多個元素( 鍵值 - 數(shù)據(jù) / 子節(jié)點 的地址)
  • BTree 節(jié)點的鍵值按 非降序 排列
  • BTree 所有葉子節(jié)點都位于同一層(具有相同的深度)

一文搞懂 MySQL 索引

查詢過程,例如:Select * from table where id = 6;

一文搞懂 MySQL 索引

BTree 的不足:

  • 不支持范圍查詢的快速查找(每次查詢都得從根節(jié)點重新進行遍歷)
  • 節(jié)點都存儲數(shù)據(jù)會導(dǎo)致磁盤數(shù)據(jù)存儲比較分散,查詢效率有所降低

B+Tree:在 BTree 的基本上,對 BTree 進行了優(yōu)化:只有葉子節(jié)點才會存儲 鍵值 - 數(shù)據(jù),非葉子節(jié)點只存儲 鍵值 和 子節(jié)點 的地址;葉子節(jié)點之間使用雙向指針進行連接,形成一個雙向有序鏈表。

一文搞懂 MySQL 索引

等值查詢,例如:Select * from table where id = 8;

一文搞懂 MySQL 索引

范圍查詢,例如:Select * from table where id between 8 and 22;

一文搞懂 MySQL 索引

B+Tree 的優(yōu)點:

  • 保證了等值查詢和范圍查詢的快速查找
  • 單一節(jié)點存儲更多的元素,減少了查詢的 IO 次數(shù)


4、MySQL 索引 的實現(xiàn)

4.1、MyISAM 索引
  • MyISAM 的 數(shù)據(jù)文件(.myd) 和 索引文件(.myi) 是分開存儲的
  • MyISAM(B+Tree)葉子節(jié)點中存儲的鍵值為索引列的值,數(shù)據(jù)為索引所在行的磁盤地址
  • MyISAM 的 主鍵索引(Primary key)和 輔助索引(Secondary key)在結(jié)構(gòu)上沒有任何區(qū)別,只是 主鍵索引 要求 鍵值唯一,而 輔助索引 鍵值 可以重復(fù)

一文搞懂 MySQL 索引


4.2、InnoDB 索引
  • 數(shù)據(jù)和索引都存儲在一個文件中(.ibd)

  • 一般情況下,聚簇索引等同于主鍵索引;除 聚簇索引 外的所有索引 均稱為 輔助索引

  • InnoDB(B+Tree)葉子節(jié)點中存儲的鍵值為索引列的值

    • 如果是聚簇索引,數(shù)據(jù)為整行記錄(除了主鍵值)
    • 如果是輔助索引,數(shù)據(jù)為該行的主鍵值
  • 每一張表都有一個聚簇索引

    • 如果表中有定義主鍵,主鍵索引用作聚簇索引
    • 如果表中沒有定義主鍵,選擇第一個不為 NULL 的唯一索引列用作聚簇索引
    • 如果以上都沒有,使用一個 6 字節(jié)長整形的隱式字段 ROWID (自增)用作聚簇索引
  • 根據(jù)在 輔助索引樹 中獲取的 主鍵id,再到 主鍵索引樹 查詢數(shù)據(jù)的過程 稱為 回表 查詢

  • 組合索引

    • 遵循 最左匹配(最左前綴)原則:
      • 使用 組合索引 查詢時,MySQL 會一直向右匹配直至遇到范圍查詢(>、<、between、like)就停止匹配。
    • 只有第一列是有序的,其它列都是無序的(最左匹配原則的原因)

主鍵索引(聚簇索引):
一文搞懂 MySQL 索引

輔助索引:

一文搞懂 MySQL 索引

組合索引:

一文搞懂 MySQL 索引

一文搞懂 MySQL 索引

覆蓋索引:

  • 覆蓋索引不是一種索引結(jié)構(gòu),而是一種優(yōu)化手段
  • 我們只需要查詢 組合索引 中的字段,而不需要表中的其它字段,在這過程中不會產(chǎn)生回表現(xiàn)象,這種情況稱為 覆蓋索引
create index idx on user(name, age, gender);
-- 使用覆蓋索引
explain select name, age, gender from user where name ='萬葉' and age = 18 and gender = '0'; 

一文搞懂 MySQL 索引

-- 未使用覆蓋索引
explain select * from user where name ='萬葉' and age = 18 and gender = '0';

一文搞懂 MySQL 索引



5、MySQL 索引 的使用

5.1、MySQL 索引 的基本語法

  • 定義 主鍵約束、外鍵約束、唯一約束 等約束時 相當(dāng)于同時在指定列上創(chuàng)建了一個索引

創(chuàng)建表時:

create table table_name(
	[col_name data_type] [unique | fulltext | spatial...],
    [unique...] [index | key] [index_name] (col_name [length], ...)
);

create table user (
    id INT NOT NULL, 
    name CHAR(30) NOT NULL, 
    unique index uniqueIdx(id) 
);

表已存在時:

-- 第一種 
alter table table_name 
	add [unique...] [index | key] [index_name] (col_name [length], ...);
	
alter table user add unique index uniqueIdx(id);

-- 第二種 
create [unique...] index index_name 
on table_name (col_name [length], ...);

create unique index uniqueIdx on user(id);


-- 刪除索引
 drop index index_name on table_name;

5.2、怎么判斷要不要加索引?

加索引:

  • 數(shù)據(jù)本身具有某種的性質(zhì),如:唯一性、非空性…
  • 頻繁進行 分組或排序 的列;如果待排序的列有多個,可以建立 組合索引

不加索引:

  • 經(jīng)常更新的列
  • 列 的值類型 很少,如 性別
  • where 條件中用不到的列
  • 參與計算的列
  • 數(shù)據(jù)量小的表

5.3、只要創(chuàng)建了索引,就一定會生效嗎?

?不一定。當(dāng)使用 組合索引 時,如果沒有遵循 最左匹配 原則,索引不生效。

例如,創(chuàng)建 id、name、age 組合索引

  • id、(id、name)、(id、name、age)查詢,索引生效
  • age、(age、name)查詢,索引不生效

5.4、怎樣判斷索引是否生效?

?使用 explain 關(guān)鍵字。

  • possible_keys:MySQL 在搜索數(shù)據(jù)記錄時可選用的各個索引
  • key:MySQL 實際選用的索引

例如:

explain select * from user where id = 1;

一文搞懂 MySQL 索引


5.5、怎么避免索引失效?文章來源地址http://www.zghlxwxcb.cn/news/detail-440557.html

  • 使用組合索引時,遵循 最左匹配 原則
  • 不在索引列上進行任何操作,如:計算、函數(shù)、類型轉(zhuǎn)換
  • 盡量使用覆蓋索引
  • 索引列 盡量不使用 不等于(!= / <>)條件、通配符開頭的模糊查詢(like %abc)、or 作為連接條件
  • 字符串加單引號(不加可能會發(fā)生索引列的隱式轉(zhuǎn)換,導(dǎo)致索引失效)

到了這里,關(guān)于一文搞懂 MySQL 索引的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • mysql處理json格式的字段,一文搞懂mysql解析json數(shù)據(jù)

    mysql處理json格式的字段,一文搞懂mysql解析json數(shù)據(jù)

    略。自行百度。 JSON 數(shù)據(jù)類型是 MySQL 5.7.8 開始支持的。在此之前,只能通過字符類型(CHAR,VARCHAR 或 TEXT )來保存 JSON 文檔。 MySQL 8.0版本中增加了對JSON類型的索引支持??梢允褂肅REATE INDEX語句創(chuàng)建JSON類型的索引,提高JSON類型數(shù)據(jù)的查詢效率。 存儲JSON文檔所需的空間與存儲

    2024年02月07日
    瀏覽(19)
  • MySQL:一文掌握MySQL索引

    MySQL:一文掌握MySQL索引

    官方定義:索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。 在數(shù)據(jù)庫中,索引被定義為一種特殊的數(shù)據(jù)結(jié)構(gòu),由數(shù)據(jù)庫中的一列或多列組合而成,可以用來快速查詢數(shù)據(jù)表中某一特定值的記錄,就像一本書的目錄一樣。索引是在表的字段的基礎(chǔ)上建立的一種數(shù)據(jù)庫對象。

    2024年02月05日
    瀏覽(22)
  • 【MYSQL篇】一文弄懂mysql索引原理

    【MYSQL篇】一文弄懂mysql索引原理

    MySQL 數(shù)據(jù)庫應(yīng)該是最常用的數(shù)據(jù)庫之一,在各種大大小小的公司都可以看到它的身影,你對 MySQL 數(shù)據(jù)庫掌握的如何呢?想要更好的使用它,那么我們就必須先了解它,正所謂的 工欲善其事,必先利其器 。 本篇文章就帶領(lǐng)大家一起來深入剖析MySQL索引的一些知識,先來了解什

    2024年02月09日
    瀏覽(24)
  • 一文讀懂 MySQL 中的索引

    一文讀懂 MySQL 中的索引

    MySQL官方對索引的 定義 為:索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。 索引的本質(zhì) :索引是數(shù)據(jù)結(jié)構(gòu)。你可以簡單理解為“排好序的快速查找數(shù)據(jù)結(jié)構(gòu)”,滿足特定查找算法。 這些數(shù)據(jù)結(jié)構(gòu)以某種方式指向數(shù)據(jù), 這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上實現(xiàn) 高級查找算

    2024年02月16日
    瀏覽(20)
  • 一文讓你對mysql索引底層實現(xiàn)明明白白

    圖片是本人隨筆畫的,有點粗糙,望大家諒解,如有不妥之處,請聯(lián)系我們,感謝 .索引是幫助mysql高效獲取數(shù)據(jù)的排好序的數(shù)據(jù)結(jié)構(gòu) .索引是存儲在文件里的 .數(shù)據(jù)結(jié)構(gòu): 二叉樹 HASH BTREE ? ? ? 如果沒有索引的話,循環(huán)一條一條的找,找一次就是一次IO,這樣速度就會很慢 我

    2024年01月16日
    瀏覽(14)
  • 【MySQL】一文帶你了解數(shù)據(jù)庫索引與事務(wù)

    數(shù)據(jù)庫索引是一種提高數(shù)據(jù)庫查詢效率的數(shù)據(jù)結(jié)構(gòu)。它可以快速地定位和訪問數(shù)據(jù)庫中的數(shù)據(jù),從而大大提高數(shù)據(jù)庫查詢的速度和效率。數(shù)據(jù)庫索引可以根據(jù)不同的查詢需求構(gòu)造多個索引,以最大化提高查詢效率。 數(shù)據(jù)庫索引基于各種字段來創(chuàng)建,在查詢時可以通過索引直接

    2024年02月09日
    瀏覽(82)
  • 一文徹底搞清楚MySQL的主鍵、外鍵、約束和各種索引

    一文徹底搞清楚MySQL的主鍵、外鍵、約束和各種索引

    主鍵用于唯一標(biāo)識表中每一行數(shù)據(jù),外鍵用于建立表與表之間關(guān)聯(lián)關(guān)系,約束用于限制表中數(shù)據(jù)的規(guī)則,索引用于加速查詢。 主鍵是一種用于唯一標(biāo)識表中每一行數(shù)據(jù)的標(biāo)識符。在Mysql中,主鍵可以是一個或多個列的組合,但是必須滿足以下條件: 主鍵列的值必須唯一,不能

    2024年02月08日
    瀏覽(18)
  • 一文帶你了解MySQL之B+樹索引的使用

    一文帶你了解MySQL之B+樹索引的使用

    前言 我們上一篇文章詳細的了InnoDB存儲引擎的B+樹索引,我們必須知道下邊這些結(jié)論: 每個索引都對應(yīng)1棵B+樹,B+樹分為好多層,最下邊一層是葉字節(jié)點,其余的是內(nèi)節(jié)點(非葉子節(jié)點)。所有用戶戶記錄都存儲在B+樹的葉子節(jié)點,所有目錄項記錄都存儲在內(nèi)節(jié)點。 InnoDB存儲

    2024年02月06日
    瀏覽(20)
  • 一文搞懂KMP算法?。?!

    一文搞懂KMP算法?。?!

    KMP算法是一種改進的 字符串匹配算法 ,由 D.E. K nuth , J.H. M orris 和 V.R. P ratt 提出的,因此人們稱它為 克努特—莫里斯—普拉特 操作(簡稱 KMP 算法)。 KMP 算法的核心是利用匹配失敗后的信息,盡量減少模式串與主串的匹配次數(shù)以達到快速匹配的目的。 具體實現(xiàn)就是通過一

    2024年02月07日
    瀏覽(21)
  • 一文搞懂containerd

    一文搞懂containerd

    在學(xué)習(xí) Containerd 之前我們有必要對 Docker 的發(fā)展歷史做一個簡單的回顧,因為這里面牽涉到的組件實戰(zhàn)是有點多,有很多我們會經(jīng)常聽到,但是不清楚這些組件到底是干什么用的,比如 libcontainer 、 runc 、 containerd 、 CRI 、 OCI 等等。 從 Docker 1.11 版本開始,Docker 容器運行就不

    2024年02月11日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包