什麼是索引?
簡單的來說,索引就是相當乙個目錄,舉個栗子,我現在想在一張學生表中查詢叫李明的學生,沒有索引的話,mysql執行全盤掃瞄(理解為for迴圈),並且掃瞄的是資料庫中的所有字段。如果我在name這個欄位上建立乙個索引,那麼只需要去查詢name這一列,然後在將這一列的值取出來就好。
索引的優缺點
任何事物都是一種雙刃劍,有優點必然有缺點。
索引的優點很明顯:查詢速度快。
索引的缺點:索引也是表中的資訊,索引如果使用不恰當,反而會使查詢速度降低。
下面乙個例子看一下用索引查詢和不用索引查詢的時間。
city表結構如下:
create table `city` (
`id` int(11) not null auto_increment,
`name` char(35) not null default '',
`countrycode` char(3) not null default '',
`district` char(20) not null default '',
`population` int(11) not null default '0',
`test` varchar(20) default null,
primary key (`id`),
key `countrycode` (`countrycode`),
constraint `city_ibfk_1` foreign key (`countrycode`) references `country` (`code`)
) engine=innodb auto_increment=4080 default charset=latin1
我們查詢人口大於200000的城市資訊:
右下角時間為0.469秒
下面我們加上索引來查一下:
重新修改表結構:
create table `city` (
`id` int(11) not null auto_increment,
`name` char(35) not null default '',
`countrycode` char(3) not null default '',
`district` char(20) not null default '',
`population` int(11) not null default '0',
`test` varchar(20) default null,
primary key (`id`),
key `countrycode` (`countrycode`),
key `testindex` (`population`),
constraint `city_ibfk_1` foreign key (`countrycode`) references `country` (`code`)
) engine=innodb auto_increment=304080 default charset=latin1
我們在population加上了普通索引,下邊來查詢:
右下角時間0.016秒,效率提交了約30倍,可見適當的加上所以還是很必要的。
索引分類
普通索引:上述使用的就是普通索引
語法:alter table 表名 add index 索引名('欄位名')
create index on 表名(列名);
唯一索引:字段設定唯一
主鍵也是唯一索引,因為主鍵字段必須是唯一的。
全文索引:可以在varchar,char,text上邊建立
這個全文索引我在用mysql8.0的時候遇到一些問題,詳見我的部落格置頂,去看看
多列索引:可以建立基於多個欄位的索引
使用其中的乙個欄位去搜尋也可以作為普通索引。
合理使用比單列索引效率更高。遵循最左匹配原則(下邊詳講)
索引在mysql是怎麼儲存的?
索引在mysql中是通過b樹,b+樹,r-樹以及雜湊型別。
最左匹配原則:
通過上面了解了索引的儲存方式以後,可以更好的了解最左匹配原則:
將age,***,grade作為多列索引。
select * from test where age<10 and *** ='man' and grade<5
查詢的時候就會先去查詢age<10的資料,然後在這點資料中找***=『man』的資料最後再進行篩選出grade<5的資料。
但是如果我把查詢條件順序修改一下,那麼他的執行是怎麼執行的呢?
select * from test where grade<5 and *** ='man' and age<10
但是這條資料並不是並不是向上述那樣執行的,那麼不是最左匹配原則嗎?
這是因為mysql中存在查詢優化器,他會去判斷這條語句怎麼執行效率最高,然後生成執行計畫。
MySQL索引介紹
索引由資料庫表中一列或者多列組合而成,其作用是提高對錶中資料的查詢速度。建立索引是指在某個表的一列或者多列上建立乙個索引,用來提高對錶的訪問速度,建立索引由三種方法 在建立表的時候建立,在已存在的表上建立和用alter table語句建立。建立索引的基本語法格式 asc引數表示公升序排列,desc引...
MySQL索引介紹
簡單理解為 排好序的快速查詢資料結構 一般來說索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存在磁碟上。我們平常所說的索引,如果沒有特別指明,一般都是指b樹結構組織的索引 b 樹索引 b 樹索引檢索原理 1 類似圖書館書目索引,提高資料檢索的效率,降低資料庫的io成本。2 ...
Mysql索引介紹
索引是在建立表的時候會自動生成乙個主鍵 以主鍵生成的 索引,所以我們可以直接搜尋索引 我們也可以建立 普通索引 create index t job index on e user t job 建立索引名 被建立的表 建立的列名 格式 所以索引可以多個.刪除普通索引 drop index t job...