索引作用
(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無需掃瞄任何記錄即可迅速得到...