MySQL 索引

MySQL 索引
索引
索引用于快速查找具有特定列值的行。如果沒(méi)有索引,MySQL必須從第一行開(kāi)始,然后讀取整個(gè)表以查找相關(guān)行。表越大,成本越高。如果表中有相關(guān)??列的索引,MySQL可以快速確定要在數(shù)據(jù)文件中間尋找的位置,而無(wú)需查看所有數(shù)據(jù)。這比按順序讀取每一行要快得多。
類似于字典中的目錄,查找字典內(nèi)容時(shí)可以根據(jù)目錄查找到數(shù)據(jù)的存放位置,然后直接獲取即可。
本質(zhì)上是告訴數(shù)據(jù)庫(kù)的存儲(chǔ)引擎如何快速找到我們所要的數(shù)據(jù)。所以 MySQL 的索引是在 MySQL 的存儲(chǔ)引擎層實(shí)現(xiàn)的,而不是在其服務(wù)器層實(shí)現(xiàn)。
MySQL中常見(jiàn)索引有:

普通索引
唯一索引
主鍵索引
組合索引

普通索引
普通索引僅有一個(gè)功能:加速查詢
/創(chuàng)建表的同時(shí)創(chuàng)建索引/

    id int not null auto_increment primary key,
    name varchar(32),
    email varchar(64),
    extra text,
    index ix_name(name)
    /*添加索引到列名 name, 索引名為 ix_name*/
)
/*單獨(dú)創(chuàng)建索引*/
create index index_name on 表名稱(列名稱)
/*Example*/
create index index_name on student(name);```

/*查看索引*/
show index from 表名稱;
/*Example*/
show index from student;

/*刪除索引*/
DROP INDEX index_name on 表名稱;
/*Example*/
DROP INDEX index_name on student;

唯一索引
唯一索引有兩個(gè)功能:加速查詢 和 唯一約束(可含null)
/*創(chuàng)建表和唯一索引*/
create table t2(
    id int not null auto_increment primary key,
    name varchar(32),
    email varchar(64),
    unique index ix_name (name)
);

/*創(chuàng)建唯一索引*/
create unique index 索引名 on 表名(列名);

/*刪除唯一索引*/
ALTER TABLE 表名 DROP INDEX 索引名;

主鍵索引
主鍵有兩個(gè)功能:加速查詢 和 唯一約束(不可含null)
當(dāng)一個(gè)列被創(chuàng)建為主鍵是,它就會(huì)被賦予主機(jī)索引的屬性。
/*創(chuàng)建表和創(chuàng)建主鍵*/
create table t3(
    id int ,
    name varchar(32) ,
    email varchar(64) ,
    primary key(name)
);

組合索引
組合索引是將n個(gè)列組合成一個(gè)索引
其應(yīng)用場(chǎng)景為:頻繁的同時(shí)使用 n 個(gè)列來(lái)進(jìn)行查詢,如:where name = 'shark' and age = 18。
create table studens(
    id int not null auto_increment primary key,
    name varchar(32) not null,
    age int not null,
)

create index idx_name_age on students(name,age);


如上創(chuàng)建組合索引之后,查詢:

name and age     -- 使用索引  where name='shark' and age=18;

name                    -- 使用索引 where name='shark';


對(duì)于多列索引的使用上需要注意, where 自己的第一個(gè)條件的列名必須是組合索引列的最左邊的那個(gè)。
下面是可以有效使用的方式
where name='shark';
where name='shark' and age>18;
 where name = 'shark'  and (age >18 or age = 10);

但是不能是下面的用法
where age = 18;
where name='shark'  or   age=19;


注意:對(duì)于同時(shí)搜索n個(gè)條件時(shí),組合索引的性能好于多個(gè)單一索引合并。

驗(yàn)證索引是否被命中
explain select name from t1 where email= '1@1.com' and name='d'\
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、什么是索引?為什么要建立索引? 索引用于快速找出在某個(gè)列中有一特定值的行,不使用索引,MySQL必須從第一條記...
    不屈真實(shí)閱讀 57,430評(píng)論 5 36
  • 1.前言: 索引對(duì)查詢的速度有著至關(guān)重要的影響,理解索引也是進(jìn)行數(shù)據(jù)庫(kù)性能調(diào)優(yōu)的起點(diǎn)。 索引是存儲(chǔ)引擎用于快速查找...
    李雷是個(gè)程序員閱讀 235評(píng)論 0 0
  • MySQL 索引分析和優(yōu)化(載錄于:http://m.jb51.net/article/5052.htm) 一、什...
    yuantao123434閱讀 5,141評(píng)論 1 5
  • 一、什么是索引? 索引用來(lái)快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹(shù)的形式保存。如果沒(méi)有索引,執(zhí)...
    Daniel521閱讀 291評(píng)論 0 0
  • 索引是用來(lái)快速檢索出具有特定值的記錄。如果沒(méi)有索引,數(shù)據(jù)庫(kù)就必須從第一條記錄開(kāi)始進(jìn)行全表掃描,直到找出相關(guān)的行。數(shù)...
    咕泡學(xué)院蓉蓉老師閱讀 530評(píng)論 0 2

友情鏈接更多精彩內(nèi)容