最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql中添加索引的3種方法及使用注意事項詳解

 更新時間:2026年01月05日 08:57:28   作者:Tech_Jia_Hui  
在MySQL中建立索引是一種優(yōu)化查詢性能的技術(shù),它能加快數(shù)據(jù)檢索的速度,這篇文章主要介紹了mysql中添加索引的3種方法及使用注意事項的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一、MySQL 創(chuàng)建索引的三種方法

1.1 在新建表時創(chuàng)建索引

-- ① 普通索引
CREATE TABLE t_dept (
    no INT NOT NULL PRIMARY KEY,
    name VARCHAR(20) NULL,
    sex VARCHAR(2) NULL,
    info VARCHAR(20) NULL,
    INDEX index_no(no)
);

-- ② 唯一索引
CREATE TABLE t_dept (
    no INT NOT NULL PRIMARY KEY,
    name VARCHAR(20) NULL,
    sex VARCHAR(2) NULL,
    info VARCHAR(20) NULL,
    UNIQUE INDEX index_name(name)
);

-- ③ 全文索引(全文索引字段通常為 TEXT 或 VARCHAR,且 InnoDB 在 MySQL 5.6+ 才支持全文索引,早期版本僅 MyISAM 支持。)
CREATE TABLE t_dept (
    no INT NOT NULL PRIMARY KEY,
    name VARCHAR(20) NULL,
    sex VARCHAR(2) NULL,
    info TEXT NULL,  -- 全文索引字段建議用 TEXT
    FULLTEXT INDEX index_info(info)
);

-- ④ 多列(復(fù)合)索引
CREATE TABLE t_dept (
    no INT NOT NULL PRIMARY KEY,
    name VARCHAR(20) NULL,
    sex VARCHAR(2) NULL,
    info VARCHAR(20) NULL,
    INDEX idx_no_name(no, name)
);

1.2 在已存在表上通過CREATE INDEX添加索引

-- 普通索引
CREATE INDEX idx_name ON t_dept(name);

-- 唯一索引
CREATE UNIQUE INDEX idx_name ON t_dept(name);

-- 全文索引
CREATE FULLTEXT INDEX idx_info ON t_dept(info);

-- 多列索引
CREATE INDEX idx_name_no ON t_dept(name, no);

?? 此方式不能用于主鍵或外鍵約束,僅用于普通/唯一/全文索引。

1.3 通過ALTER TABLE修改表結(jié)構(gòu)添加索引

-- 普通索引
ALTER TABLE t_dept ADD INDEX idx_name(name);
 
-- 唯一索引
ALTER TABLE t_dept ADD UNIQUE INDEX idx_name(name);
 
-- 全文索引
ALTER TABLE t_dept ADD FULLTEXT INDEX idx_info(info);
 
-- 多列索引
ALTER TABLE t_dept ADD INDEX idx_name_no(name, no);

? 推薦在生產(chǎn)環(huán)境中使用 ALTER TABLE,語義更清晰,且支持更多選項(如指定索引類型)。

二、MySQL 索引類型與適用場景

索引類型關(guān)鍵字特點適用場景
普通索引INDEX / KEY加速查詢,允許重復(fù)值高頻 WHERE、ORDER BY 字段
唯一索引UNIQUE值唯一,自動校驗重復(fù)身份證號、郵箱、訂單號等需唯一字段
主鍵索引PRIMARY KEY特殊的唯一索引,一張表僅一個表的主標識(自增 ID 等)
全文索引FULLTEXT支持關(guān)鍵詞全文檢索文章內(nèi)容、商品描述等大文本字段
復(fù)合索引INDEX(col1, col2, ...)多字段組合索引多條件聯(lián)合查詢(注意最左前綴原則)

三、索引使用注意事項與限制

有效使用索引的場景

  • WHERE column = ?
  • WHERE column LIKE 'abc%'(前綴匹配)
  • ORDER BY column(無表達式)
  • 復(fù)合索引遵循 最左前綴原則INDEX(A,B,C) 可用于 (A)、(A,B)、(A,B,C) 查詢

索引失效的常見情況

場景示例是否走索引
使用函數(shù)WHERE DAY(create_time) = '2024-01-01'?
不等號查詢WHERE status != 1?(部分情況可能走)
通配符開頭WHERE name LIKE '%john'?
類型隱式轉(zhuǎn)換WHERE user_id = '123'(user_id 為 INT)?
OR 條件未全覆蓋索引WHERE name = 'a' OR age = 20(僅 name 有索引)?

四、索引的優(yōu)缺點

優(yōu)點

  • 顯著提升 SELECT 查詢速度
  • 加速 JOIN、ORDER BY、GROUP BY 操作
  • 唯一索引保障數(shù)據(jù) 完整性

缺點

  • 降低寫性能:INSERT/UPDATE/DELETE 需同步更新索引
  • 占用磁盤空間:索引文件可能接近甚至超過數(shù)據(jù)本身
  • 維護成本高:過多索引增加優(yōu)化器負擔

?? 建議

  • 單表索引數(shù)量 ≤ 5~8 個(MySQL 限制最多 16 個)
  • 僅為 高頻查詢字段 建索引
  • 避免為低區(qū)分度字段建索引(如性別、狀態(tài) 0/1)

五、InnoDB 與 MyISAM 索引差異

特性InnoDBMyISAM
主鍵索引聚簇索引(數(shù)據(jù)按主鍵物理存儲)非聚簇索引
全文索引MySQL 5.6+ 支持原生支持
行級鎖基于索引實現(xiàn)不支持行鎖
崩潰恢復(fù)支持事務(wù)回滾無事務(wù)

?? 關(guān)鍵點:InnoDB 的行鎖是通過索引實現(xiàn)的!無索引的 UPDATE 會鎖全表

六、索引優(yōu)化工具:EXPLAIN

使用 EXPLAIN 分析 SQL 執(zhí)行計劃:

EXPLAIN SELECT * FROM t_dept WHERE name = 'IT'; 

重點關(guān)注字段:

  • type:訪問類型(const > ref > range > index > ALL
  • key:實際使用的索引
  • rows:掃描行數(shù)(越小越好)
  • Extra:是否出現(xiàn) Using filesort / Using temporary

七、總結(jié)

索引是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個組成部分),它們包含著對數(shù)據(jù)表里所有記錄的引用指針。

注:

[1]索引不是萬能的!索引可以加快數(shù)據(jù)檢索操作,但會使數(shù)據(jù)修改操作變慢。每修改數(shù)據(jù)記錄,索引就必須刷新一次。為了在某種程序上彌補這一缺陷,許 多SQL命令都有一個DELAY_KEY_WRITE項。這個選項的作用是暫時制止MySQL在該命令每插入一條新記錄和每修改一條現(xiàn)有之后立刻對索引進 行刷新,對索引的刷新將等到全部記錄插入/修改完畢之后再進行。在需要把許多新記錄插入某個數(shù)據(jù)表的場合,DELAY_KEY_WRITE選項的作用將非 常明顯。

[2]另外,索引還會在硬盤上占用相當大的空間。因此應(yīng)該只為最經(jīng)常查詢和最經(jīng)常排序的數(shù)據(jù)列建立索引。注意,如果某個數(shù)據(jù)列包含許多重復(fù)的內(nèi) 容,為它建立索引就沒有太大的實際效果。

從理論上講,完全可以為數(shù)據(jù)表里的每個字段分別建一個索引,但MySQL把同一個數(shù)據(jù)表里的索引總數(shù)限制為16個。

1. InnoDB數(shù)據(jù)表的索引

與MyISAM數(shù)據(jù)表相比,索引對InnoDB數(shù)據(jù)的重要性要大得多。在InnoDB數(shù)據(jù)表上,索引對InnoDB數(shù)據(jù)表的重要性要在得多。在 InnoDB數(shù)據(jù)表上,索引不僅會在搜索數(shù)據(jù)記錄時發(fā)揮作用,還是數(shù)據(jù)行級鎖定機制的基礎(chǔ)。”數(shù)據(jù)行級鎖定”的意思是指在事務(wù)操作的執(zhí)行過程中鎖定正 在被處理的個別記錄,不讓其他用戶進行訪問。這種鎖定將影響到(但不限于)SELECT…LOCK IN SHARE MODE、SELECT…FOR UPDATE命令以及INSERT、UPDATE和DELETE命令。

出于效率方面的考慮,InnoDB數(shù)據(jù)表的數(shù)據(jù)行級鎖定實際發(fā)生在它們的索引上,而不是數(shù)據(jù)表自身上。顯然,數(shù)據(jù)行級鎖定機制只有在有關(guān)的數(shù)據(jù)表有一個合 適的索引可供鎖定的時候才能發(fā)揮效力。

2. 限制

如果WEHERE子句的查詢條件里有不等號(WHERE coloum != …),MySQL將無法使用索引。

類似地,如果WHERE子句的查詢條件里使用了函數(shù)(WHERE DAY(column) = …),MySQL也將無法使用索引。

在JOIN操作中(需要從多個數(shù)據(jù)表提取數(shù)據(jù)時),MySQL只有在主鍵和外鍵的數(shù)據(jù)類型相同時才能使用索引。

如果WHERE子句的查詢條件里使用比較操作符LIKE和REGEXP,MySQL只有在搜索模板的第一個字符不是通配符的情況下才能使用索引。比如說, 如果查詢條件是LIKE ‘abc%’,MySQL將使用索引;如果查詢條件是LIKE ‘%abc’,MySQL將不使用索引。

在ORDER BY操作中,MySQL只有在排序條件不是一個查詢條件表達式的情況下才使用索引。(雖然如此,在涉及多個數(shù)據(jù)表查詢里,即使有索引可用,那些索引在加快 ORDER BY方面也沒什么作用)

如果某個數(shù)據(jù)列里包含許多重復(fù)的值,就算為它建立了索引也不會有很好的效果。比如說,如果某個數(shù)據(jù)列里包含的凈是些諸如”0/1″或”Y/N”等值,就沒 有必要為它創(chuàng)建一個索引。

普通索引、唯一索引和主索引

1. 普通索引

普通索引(由關(guān)鍵字KEY或INDEX定義的索引)的唯一任務(wù)是加快對數(shù)據(jù)的訪問速度。因此,應(yīng)該只為那些最經(jīng)常出現(xiàn)在查詢條件(WHERE column = …)或排序條件(ORDER BY column)中的數(shù)據(jù)列創(chuàng)建索引。只要有可能,就應(yīng)該選擇一個數(shù)據(jù)最整齊、最緊湊的數(shù)據(jù)列(如一個整數(shù)類型的數(shù)據(jù)列)來創(chuàng)建索引。

2. 唯一索引

普通索引允許被索引的數(shù)據(jù)列包含重復(fù)的值。比如說,因為人有可能同名,所以同一個姓名在同一個”員工個人資料”數(shù)據(jù)表里可能出現(xiàn)兩次或更多次。

如果能確定某個數(shù)據(jù)列將只包含彼此各不相同的值,在為這個數(shù)據(jù)列創(chuàng)建索引的時候就應(yīng)該用關(guān)鍵字UNIQUE把它定義為一個唯一索引。這么做的好處:一是簡 化了MySQL對這個索引的管理工作,這個索引也因此而變得更有效率;二是MySQL會在有新記錄插入數(shù)據(jù)表時,自動檢查新記錄的這個字段的值是否已經(jīng)在 某個記錄的這個字段里出現(xiàn)過了;如果是,MySQL將拒絕插入那條新記錄。也就是說,唯一索引可以保證數(shù)據(jù)記錄的唯一性。事實上,在許多場合,人們創(chuàng)建唯 一索引的目的往往不是為了提高訪問速度,而只是為了避免數(shù)據(jù)出現(xiàn)重復(fù)。

3. 主索引

在前面已經(jīng)反復(fù)多次強調(diào)過:必須為主鍵字段創(chuàng)建一個索引,這個索引就是所謂的”主索引”。主索引與唯一索引的唯一區(qū)別是:前者在定義時使用的關(guān)鍵字是 PRIMARY而不是UNIQUE。

4. 外鍵索引

如果為某個外鍵字段定義了一個外鍵約束條件,MySQL就會定義一個內(nèi)部索引來幫助自己以最有效率的方式去管理和使用外鍵約束條件。

5. 復(fù)合索引

索引可以覆蓋多個數(shù)據(jù)列,如像INDEX(columnA, columnB)索引。這種索引的特點是MySQL可以有選擇地使用一個這樣的索引。如果查詢操作只需要用到columnA數(shù)據(jù)列上的一個索引,就可以使 用復(fù)合索引INDEX(columnA, columnB)。不過,這種用法僅適用于在復(fù)合索引中排列在前的數(shù)據(jù)列組合。比如說,INDEX(A, B, C)可以當做A或(A, B)的索引來使用,但不能當做B、C或(B, C)的索引來使用。

6. 索引的長度

在為CHAR和VARCHAR類型的數(shù)據(jù)列定義索引時,可以把索引的長度限制為一個給定的字符個數(shù)(這個數(shù)字必須小于這個字段所允許的最大字符個數(shù))。這 么做的好處是可以生成一個尺寸比較小、檢索速度卻比較快的索引文件。在絕大多數(shù)應(yīng)用里,數(shù)據(jù)庫中的字符串數(shù)據(jù)大都以各種各樣的名字為主,把索引的長度設(shè)置 為10~15個字符已經(jīng)足以把搜索范圍縮小到很少的幾條數(shù)據(jù)記錄了。

在為BLOB和TEXT類型的數(shù)據(jù)列創(chuàng)建索引時,必須對索引的長度做出限制;MySQL所允許的最大索引長度是255個字符。

全文索引

文本字段上的普通索引只能加快對出現(xiàn)在字段內(nèi)容最前面的字符串(也就是字段內(nèi)容開頭的字符)進行檢索操作。如果字段里存放的是由幾個、甚至是多個單詞構(gòu)成 的較大段文字,普通索引就沒什么作用了。這種檢索往往以LIKE %word%的形式出現(xiàn),這對MySQL來說很復(fù)雜,如果需要處理的數(shù)據(jù)量很大,響應(yīng)時間就會很長。

這類場合正是全文索引(full-text index)可以大顯身手的地方。在生成這種類型的索引時,MySQL將把在文本中出現(xiàn)的所有單詞創(chuàng)建為一份清單,查詢操作將根據(jù)這份清單去檢索有關(guān)的數(shù) 據(jù)記錄。全文索引即可以隨數(shù)據(jù)表一同創(chuàng)建,也可以等日后有必要時再使用下面這條命令添加:

ALTER TABLE tablename ADD FULLTEXT(column1, column2)

有了全文索引,就可以用SELECT查詢命令去檢索那些包含著一個或多個給定單詞的數(shù)據(jù)記錄了。下面是這類查詢命令的基本語法:

SELECT * FROM tablename

WHERE MATCH(column1, column2) AGAINST(‘word1′, ‘word2′, ‘word3′)

上面這條命令將把column1和column2字段里有word1、word2和word3的數(shù)據(jù)記錄全部查詢出來。

注:InnoDB 數(shù)據(jù)表是支持全文索引(FULLTEXT INDEX)的,但 有版本限制

正確結(jié)論:

MySQL 版本InnoDB 是否支持 FULLTEXT 索引?
MySQL 5.6 之前(如 5.5、5.1)不支持,僅 MyISAM 支持
MySQL 5.6 及以后(包括 5.7、8.0、8.4 等)完全支持

到此這篇關(guān)于mysql中添加索引的3種方法及使用注意事項詳解的文章就介紹到這了,更多相關(guān)mysql添加索引方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解mysql基本操作語句命令

    詳解mysql基本操作語句命令

    本文介紹了 鏈接Mysql,以及增刪改查等功能,需要的朋友可以參考
    2017-04-04
  • MySQL中建表時可空(NULL)和非空(NOT NULL)的用法詳解

    MySQL中建表時可空(NULL)和非空(NOT NULL)的用法詳解

    這篇文章主要介紹了MySQL中建表時可空(NULL)和非空(NOT NULL)的用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Mysql數(shù)據(jù)庫5.7升級到8.4的實現(xiàn)

    Mysql數(shù)據(jù)庫5.7升級到8.4的實現(xiàn)

    很多情況需要升級MySQL的數(shù)據(jù)庫版本,本文主要介紹了Mysql數(shù)據(jù)庫5.7升級到8.4的實現(xiàn),文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • 分析Mysql表讀寫、索引等操作的sql語句效率優(yōu)化問題

    分析Mysql表讀寫、索引等操作的sql語句效率優(yōu)化問題

    今天小編就為大家分享一篇關(guān)于分析Mysql表讀寫、索引等操作的sql語句效率優(yōu)化問題,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • MySQL的23個需要注意的地方

    MySQL的23個需要注意的地方

    本文將為大家介紹的是MySQL數(shù)據(jù)庫的23個特別注意事項,希望各位DBA能從中得到一些啟發(fā)。
    2010-08-08
  • MySQL 常用命令

    MySQL 常用命令

    MySQL 常用命令...
    2006-12-12
  • MySQL下的RAND()優(yōu)化案例分析

    MySQL下的RAND()優(yōu)化案例分析

    這篇文章主要介紹了MySQL下的RAND()優(yōu)化案例,包括對JOIN查詢和子查詢的優(yōu)化,需要的朋友可以參考下
    2015-05-05
  • 在OneProxy的基礎(chǔ)上實行MySQL讀寫分離與負載均衡

    在OneProxy的基礎(chǔ)上實行MySQL讀寫分離與負載均衡

    基于Libevent機制實現(xiàn),單個實例可以實現(xiàn)25萬的SQL轉(zhuǎn)發(fā)能力,用一個OneProxy節(jié)點可以帶動整個MySQL集群,為業(yè)務(wù)發(fā)展貢獻一份力量,下面由小編來為大家簡單說說
    2019-05-05
  • MySQL重置密碼終極版(附詳細步驟)

    MySQL重置密碼終極版(附詳細步驟)

    mysql是最常見的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一,它是開源的,易于使用和管理,對于mysql管理員來說,密碼管理是非常重要的,因為數(shù)據(jù)庫可能保存著重要的信息,這篇文章主要介紹了MySQL重置密碼終極版的相關(guān)資料,需要的朋友可以參考下
    2025-07-07
  • MySQL深分頁問題的原因及解決方案

    MySQL深分頁問題的原因及解決方案

    MySQL?作為最受歡迎的開源關(guān)系數(shù)據(jù)庫之一,被廣泛用于各種規(guī)模的應(yīng)用程序中,分頁是一種常見的數(shù)據(jù)檢索技術(shù),它允許用戶在大量數(shù)據(jù)中瀏覽和檢索信息,當涉及到“深分頁”時,即查詢大量數(shù)據(jù)后的頁面時,MySQL?的性能可能會顯著下降,本文介紹了MySQL深分頁問題的原因及解決方案
    2024-09-09

最新評論

通道| 宁强县| 宁远县| 襄汾县| 永康市| 开封市| 商城县| 章丘市| 莱州市| 宜春市| 普宁市| 浮梁县| 大渡口区| 施秉县| 图木舒克市| 淮安市| 行唐县| 达州市| 望城县| 林口县| 霍州市| 光泽县| 鹿邑县| 西乌珠穆沁旗| 清远市| 阳城县| 新疆| 萨嘎县| 五莲县| 枣强县| 景谷| 格尔木市| 安顺市| 彭水| 敦化市| 子长县| 陇川县| 遵义市| 天峻县| 临沭县| 渝北区|