1.索引的分類
在mysql中索引可以分為三類:
主鍵索引:設定為主鍵的列會建立主鍵索引,主鍵唯一非空。
單列索引:即索引中只包含乙個列,一張表可以有多個單列索引
唯一索引:索引列的值必須唯一,允許有空值
4)復合索引:即索引中可以包含多個列
2.建立索引
可以在建立表的同時建立索引,也可以在已有表的基礎上去建立索引
環境準備建立資料庫和表:
create database demo_01 default charset=utf8mb4;
use demo_01;
create table `city` (
`city_id` int(11) not null auto_increment,
`city_name` varchar(50) not null,
`country_id` int(11) not null,
primary key (`city_id`)
) engine=innodb default charset=utf8;
create table `country` (
`country_id` int(11) not null auto_increment,
`country_name` varchar(100) not null,
primary key (`country_id`)
) engine=innodb default charset=utf8;
insert into `city` (`city_id`, `city_name`, `country_id`) values(1,'西安',1);
insert into `city` (`city_id`, `city_name`, `country_id`) values(2,'newyork',2);
insert into `city` (`city_id`, `city_name`, `country_id`) values(3,'北京',1);
insert into `city` (`city_id`, `city_name`, `country_id`) values(4,'上海',1);
insert into `country` (`country_id`, `country_name`) values(1,'china');
insert into `country` (`country_id`, `country_name`) values(2,'america');
insert into `country` (`country_id`, `country_name`) values(3,'japan');
insert into `country` (`country_id`, `country_name`) values(4,'uk');
為city表中的city_name欄位建立索引
create index idx_city_name on city(city_name)
檢視city表中的索引
show index from city
刪除city表上的索引idx_city_name
drop index idx_city_name on city
使用alter命令新增索引
1). alter table tb_name add primary key(column_list);
該語句新增乙個主鍵,這意味著索引值必須是唯一的,且不能為
null
2). alter table tb_name add unique index_name(column_list);
這條語句建立索引的值必須是唯一的(除了
null
外,null
可能會出現多次)
3). alter table tb_name add index index_name(column_list);
新增普通索引, 索引值可以出現多次。
4). alter table tb_name add fulltext index_name(column_list);
該語句指定了索引為
fulltext
, 用於全文索引
索引設計原則
在建立索引的時候我們需要遵循一些原則以更好的利用索引
對經常需要進行查詢並且資料量很大的表建立索引
在選擇索引欄位的時候一般選擇作為查詢條件的字段,如果作為查詢條件的字段比較多則選擇最常用的乙個。
選擇區分度高的字段作為索引,區分度越高索引的效率越高
雖然索引可以極大的提高查詢效率,但也不是多多益善,在做增刪改操作的時候需要對索引進行維護,如果索引過多,維護的成本相應的也高。而且如果索引過多,選擇索引也需要消耗一些資源。
使用短索引,因為索引也是存在磁碟上的,磁碟的io效率對索引查詢的效能也有較大的影響,索引越短,在乙個儲存塊內能儲存的索引值就越多,io效率也就越高
建立組合索引,如果n個列建立的組合索引相當於建立了n個索引。
單列索引和組合索引的區別:
這裡有sql語句:
select * from city where city_name = '北京' and country_id = 1
如果在city_name上建立單列索引
則執行該sql語句時會使用索引查詢出city_name為北京的記錄放到中間表中,再在結果中過濾出country_id為1的記錄。
如果在city_name和country_id上建立單列索引
則執行該sql語句時只會使用city_name上的索引,country_id上的索引不會用上,為什麼呢?因為這裡涉及到了mysql優化器的優化策略,當多個條件查詢時,優化器會評估用哪個條件的索引效率最高,它會選擇效率最高的索引來使用,所以這裡city_name上的索引或country_id上的索引都可能被選中,也有可能同時使用這兩個索引。
如果在city_name和country_id上建立組合索引,且順序為city_name在前則測試如下:
select * from city where city_name = '北京'
會使用該索引
select * from city where country_id=1
不會使用該索引
select * from city where city_name = '北京' and country_id = 1
會使用該索引
select * from city where country_id = 1 and city_name = '北京'
會使用該索引
為什麼會產生這樣的結果呢?
我們可以把聯合索引看成是**簿
人名由姓和名組成,聯合索引首先按姓氏進行排序,如果姓氏相同則按名字排序,如果您知道姓就可以通過姓快速查詢改姓的人,如果您知道姓和名就可以快速定位到人。如果您只知道名則無法利用**簿的這種排序方式提高查詢速度
所以在建立聯合索引時應該仔細考慮索引列的順序,對索引列的所有列執行搜尋或者僅對索引列的前幾列進行搜尋時聯合索引非常有用,僅對後面任意列進行搜尋時聯合索引沒有用處。
最左字首原則:
也就是以最左邊為起點任何連續的索引都能匹配上,所以在建立聯合索引的時候where查詢語句使用最頻繁的列放在最左邊擴充套件性比較好,比如上例中經常需要根據city_name來查詢在建立聯合索引的時候就可以把city_name放在最左邊。
總結:多個單列索引在多條件查詢時優化器會選擇最優索引策略,有可能是其中乙個也有可能都用上,但是多個單列索引每個索引都會占用磁碟空間,也會降低搜尋效率,所以在只有多條件聯合查詢時最好使用聯合索引。
MYSQL用法 九 索引用法
什麼是索引 索引時一種特殊的檔案,他們包涵著對資料表裡所有記錄的引用指標。當對資料表記錄進行更新後,都會對索引進行重新整理。索引會占用相當大的空間,應該只為經常查詢和最經常排序的資料列建立索引。索引型別 普通索引 這是最基本的索引型別,而且它沒有唯一性之類的限制。普通索引可以通過以下幾種方式建立 i...
MySQL索引用法例項分析
mysql描述 乙個文章庫,裡面有兩個表 category和art程式設計客棧icle。category裡面有10條分類資料。article裡面有20萬條。article裡面有乙個 article category 欄位是與category裡的 category id 字段相對應的。article表...
mysql預設索引 mysql的索引
什麼是索引 當你在字典中查詢你的名字的時候,你有兩種方式。第 一 一頁一頁的翻,第 二 通過拼音 筆畫,等查詢。那麼第二種方式就是通過索引的方式查詢。那麼在myslq中資料庫也是這麼幹的。索引可以增加查詢速度,但是同時mysql維護索引也需要耗費效能。索引的分類 主鍵索引 如果乙個字段為主鍵 pri...