MySQL 索引總結

2021-09-19 12:00:50 字數 3407 閱讀 3362

索引作用

(1)約束

(2)加速查詢

索引分類

3.普通索引建立方式

create index 索引名稱 on 表名(列名,)

create index ix_name on userinfo3(email); --對userifo3表中email列建立普通索引,名字ix_name

--刪除普通索引

drop index 索引名稱 on 表名

4.唯一索引建立方式(也可在建表時建立,見文章mysql唯一索引,加sql操作補充)

也可在建表時建立

create unique index 索引名稱 on 表名(列名)

drop unique index 索引名稱 on 表名

5.組合索引(遵循最左字首匹配,否則無法命中索引):

建立組合索引

create unique index 索引名稱 on 表名(列名,列名)

刪除組合索引

drop unique index 索引名稱 on 表名

注意最左字首匹配,如

create index ix_name_email on userinfo3(name,email,) --建立name與email組合索引

select * from userinfo3 where name='alex'; --查詢條件name,遵循最左字首匹配

select * from userinfo3 where name='alex' and email='asdf'; -- 查詢條件name與email ,遵循最左字首匹配

select * from userinfo3 where email='[email protected]'; --不遵循最左字首匹配,無法命中索引,即索引不生效

6 覆蓋索引

在索引檔案中直接獲得資料,若已經為email列建立索引

select email from userinfo3 where email='[email protected]';
7 索引合併

指把多個單列索引合併使用,但效率沒有組合索引高,若為name與email列都建立單獨建立索引,下面3種查詢方式都支援,而不用建立索引合併

select  * from userinfo3 where name='alex' and email='asdf';

select * from userinfo3 where name='alex';

select * from userinfo3 where email='alex';

8 建立索引之後,必須命中索引,才能生效,以下是無法命中索引的情況

select * from tb1 where email like '%cn';
select * from tb1 where reverse(email) = 'yangzi';
id列為索引,但name列不是索引,此時無法命中

select * from tb1 where nid = 1 or name = '[email protected]';

但下面情況會走索引,id,email為索引,name列不是索引

select * from tb1 where nid = 1 or name = '[email protected]' and email = 'alex'

如果列是字串型別,傳入條件是必須用引號引起來,不然不走索引,即email建立索引是字串型別,但是查詢是整數

select * from tb1 where email = 999;

已為email列建立索引

select * from tb1 where email != 'alex'

特別的:如果是主鍵,則還是會走索引

select * from tb1 where nid != 123

select * from tb1 where email > 'alex'

特別的:如果是主鍵或索引是整數型別,則還是會走索引

select * from tb1 where nid > 123

select * from tb1 where num > 123

select name from tb1 order by email desc;

當根據索引排序時候,選擇的對映如果不是索引,則不走索引

特別的:如果對主鍵排序,則還是走索引:

select * from tb1 order by nid desc;

如果組合索引為:(name,email)

name and email -- 使用索引

name -- 使用索引

email -- 不使用索引

9 執行計畫:讓mysql預估執行操作(一般預估結果是正確)

效率從小到大排列:

all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const

以下語句為直接查詢

select * from userinfo3 where name='alex'
加上explain關鍵字就是預估操作

explain select * from userinfo3 where name='alex'
顯示type: all(全表掃瞄),但修改查詢語句為

select * from userinfo3 limit 1;
雖然顯示type: all(全表掃瞄),但查詢效率依然很快,若顯示type: const(走索引)

9 dba工作,記錄慢日誌,即記錄查詢效率低的sql語句

檢視mysql配置方法

show variables like '%query%'

修改配置方法1

set global 變數名 = 值(set slow_query_log = on)

修改配置方法2

建立配置檔案

mysqld --defaults-file='e:\wupeiqi\mysql-5.7.16-winx64\mysql-5.7.16-winx64\my-default.ini'

my.conf內容:

slow_query_log = on

slow_query_log_file = d:/....

注意:修改配置檔案之後,需要重啟服務

mysql 索引總結 mysql索引總結

mysql中每乙個表都有乙個聚簇索引clusted index,該所索引是預設建立的,除此之外的表上的每乙個非聚簇索引都是二級索引,又叫輔助索引 secondary indexes 以innodb來說,每個innodb表具有乙個特殊的索引稱為聚集索引,如果您的表上定義有主鍵,該主鍵索引是聚集索引,如...

mysql次級索引 MySQL 索引總結

1 索引是做什麼的?想象一下,你面前有本詞典,資料就是書的正文內容,你就是那個cpu,而索引,則是書的目錄 索引用於快速找出在某個列中有一特定值的行。不使用索引,mysql必須從第1條記錄開始然後讀完整個表直到找出相關的行。表越大,花費的時間越多。如果表中查詢的列有乙個索引,mysql能快速到達乙個...

mysql 索引總結

索引用來快速地尋找那些具有特定值的記錄,所有mysql索引都以b 樹的形式儲存。如果沒有索引,執行查詢時mysql必須從第乙個記錄開始掃瞄整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上已經建立了索引,mysql無需掃瞄任何記錄即可迅速得到...