索引是一種數(shù)據(jù)結(jié)構(gòu),以其特有的記錄數(shù)據(jù)的方式,為用戶提供高性能的查詢。索引就像是一本新華字典的目錄,通過(guò)目錄可以快速的找到我們想要找到的數(shù)據(jù)。
廣西ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書(shū)銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書(shū)合作)期待與您的合作!
普通索引:MySQL中基本索引類型,僅有加速查詢功能,允許在定義索引的列中插入重復(fù)的值和空值。
主鍵索引:有兩個(gè)功能:加速查詢 和 唯一約束(不可含null)
唯一索引:有兩個(gè)功能:加速查詢 和 唯一約束(可含null)
組合索引:組合索引是將n個(gè)列組合成一個(gè)索引
part1:創(chuàng)建表時(shí)創(chuàng)建索引
create table user(
nid int not null auto_increment primary key,
name varchar(50) not null,
passwd varchar(100) not null,
extra text,
index idx1(name)
)![](/upload/otherpic63/39334e56fbb24560becb2c8a0ae9cc98.png)
note:如果是CHAR,VARCHAR類型,length可以小于字段實(shí)際長(zhǎng)度;如果是BLOB和TEXT類型,必須指定 length。
part2:創(chuàng)建索引
create index idx2 on user(name);
show index from user;
drop index idx2 on user;
part1:創(chuàng)建表時(shí)創(chuàng)建索引
create table user(
nid int not null auto_increment primary key,
name varchar(50) not null,
passwd varchar(100) not null,
extra text,
unique idx1(name)
)
part2:創(chuàng)建索引
create unique idx2 on user(name);
show index from user;
drop index idx2 on user;
part1:創(chuàng)建表時(shí)創(chuàng)建索引
create table user(
nid int not null auto_increment ,
name varchar(50) not null,
passwd varchar(100) not null,
extra text,
primary key(nid),
index idx1(name)
)
part2:創(chuàng)建索引
alter table idx2 add primary key(nid);
alter table user drop primary key;
alter table user modify nid int, drop primary key;
part1:創(chuàng)建表時(shí)創(chuàng)建索引
create table user(
nid int not null auto_increment primary key,
name varchar(50) not null,
passwd varchar(100) not null,
index idx(nid,name,passwd)
)
part2:創(chuàng)建索引
create index idx on user(nid,name,passwd);
show index from user;
drop index idx on user;
組合索引查詢遵循最左匹配:如查詢:
nid and name :使用索引
nid and passwd :使用索引
passwd:不適用索引
上述4種MySQL常用的索引,其查找數(shù)據(jù)的順序都是先在索引中找,再去數(shù)據(jù)表中找。如果一個(gè)查詢只在索引中便能完成,而不需要去數(shù)據(jù)表中找,這種索引被稱為覆蓋索引。覆蓋索引必須要求存儲(chǔ)索引的列,所以只有btree索引能使用更為高效的覆蓋索引。
explain用于顯示SQL執(zhí)行信息參數(shù),根據(jù)參考信息可以進(jìn)行SQL優(yōu)化
mysql> explain select * from t1;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.01 sec)
EXPLAIN列的解釋:
select_type :查詢類型
table:正在訪問(wèn)的表名
type:連接類型,性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const
possible_keys:顯示可能應(yīng)用在這張表中的索引,也可以是where語(yǔ)句后合適的語(yǔ)句
key:實(shí)際使用的索引
key_len:實(shí)際使用的索引的字節(jié)長(zhǎng)度
rows:為了找到所需的內(nèi)容預(yù)估要讀取的行數(shù)
extra:描述信息如下
Using index:要查詢的列數(shù)據(jù)僅使用索引中的信息,而沒(méi)有讀取數(shù)據(jù)表中的信息
Using temporary:mysql需要?jiǎng)?chuàng)建一個(gè)臨時(shí)表來(lái)存儲(chǔ)結(jié)果,這通常發(fā)生在對(duì)不同的列集進(jìn)行order by上,而不是group by上,這種情況下,需要優(yōu)化查詢
Using filesort:這意味著mysql會(huì)對(duì)結(jié)果使用一個(gè)外部索引排序,而不是按索引次序從表里讀取行。mysql有兩種文件排序算法,這兩種排序方式都可以在內(nèi)存或者磁盤(pán)上完成,explain不會(huì)告訴你mysql將使用哪一種文件排序,也不會(huì)告訴你排序會(huì)在內(nèi)存里還是磁盤(pán)上完成。
Range checked for each record(index map: #):沒(méi)有找到合適的索引,因此對(duì)從前面表中來(lái)的每一個(gè)行組合,#是顯示在possible_keys列中索引的位圖,并且是冗余的。
更多詳細(xì)信息參見(jiàn):MySQL官方文檔