013_索引
1. 索引介紹
1.1. 您可以在表中創(chuàng)建索引, 以便更加快速高效地查詢數(shù)據(jù)。
1.2. 打個(gè)比方, 如果合理的設(shè)計(jì)且使用索引的MySQL是一輛蘭博基尼的話, 那么沒有設(shè)計(jì)和使用索引的MySQL就是一個(gè)人力三輪車。
1.3. 用戶無法看到索引, 它們只能被用來加速搜索/查詢。
1.4. 索引分單列索引和組合索引。單列索引, 即一個(gè)索引只包含單個(gè)列。組合索引, 即一個(gè)索引包含多個(gè)列。
1.5. 創(chuàng)建索引時(shí), 你需要確保該索引是應(yīng)用在SQL查詢語句的條件(一般作為where子句的條件)。
1.6. 實(shí)際上, 索引也是一張表, 該表保存了主鍵與索引字段, 并指向?qū)嶓w表的記錄。
1.7. 上面都在說使用索引的好處, 但過多的使用索引將會(huì)造成濫用。因此索引也會(huì)有它的缺點(diǎn): 雖然索引大大提高了查詢速度, 同時(shí)卻會(huì)降低更新表的速度, 如對(duì)表進(jìn)行insert、update和delete。因?yàn)楦卤頃r(shí), MySQL不僅要保存數(shù)據(jù), 還要保存一下索引文件。
1.8. 建立索引會(huì)占用磁盤空間的索引文件。
2. 普通索引
2.1. 這是最基本的索引, 它沒有任何限制。
2.2. 創(chuàng)建普通索引
create index `indexname` on `tablename` (`columnname`);
2.3. 修改表結(jié)構(gòu)添加普通索引
alter table `tablename` add index `indexname` (`columnname`);
2.4. 創(chuàng)建表的時(shí)候直接指定
create table `tablename` ( ?
`id` int(11) not null, ??
`username` varchar(16) not null, ??
index `indexname` (`username`) ??
); ?
3. 唯一索引
3.1. 唯一索引與普通索引類似, 不同的就是索引列的值必須唯一, 但允許有空值。如果是組合索引, 則列值的組合必須唯一。
3.2. 創(chuàng)建唯一索引
create unique `indexname` on `tablename` (`columnname`);
3.3. 修改表結(jié)構(gòu)添加唯一索引
alter table `tablename` add unique index `indexname` (`columnname`);
3.4. 創(chuàng)建表的時(shí)候直接指定
create table `tablename` ( ?
`id` int(11) not null, ??
`username` varchar(16) not null, ??
unique `indexname` (`username`) ??
); ?
4. 刪除索引
4.1. drop index `indexname` on `tablename`;
4.2. alter table `tablename` drop index `indexname`;
5. 顯示索引信息
5.1. 你可以使用show index命令來列出表中的相關(guān)的索引信息??梢酝ㄟ^添加\G來格式化輸出信息。
show index from `tablename`; \G
6. 索引查詢
6.1. 創(chuàng)建一張Persons表, 同時(shí)插入400多萬條數(shù)據(jù)。
drop table if exists `persons`; create table `persons` (`id` int(11) not null,`lastname` varchar(255) not null,`firstname` varchar(255) default null,`address` varchar(255) default null,`city` varchar(255) default null ) engine=innodb default charset=utf8;insert into `persons` values ('1', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('2', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('3', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('4', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('5', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('6', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('7', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('8', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('9', 'san', 'zhang', 'china', 'luoyang'); ...... insert into `persons` values ('3999990', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('3999991', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('3999992', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('3999993', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('3999994', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('3999995', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('3999996', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('3999997', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('3999998', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('3999999', 'san', 'zhang', 'china', 'luoyang'); insert into `persons` values ('4000000', 'san', 'zhang', 'china', 'luoyang');6.2. 沒有使用索引, 查詢Persons表的第3000000條數(shù)據(jù), 耗時(shí)3秒多。
6.3. 給Persons表添加索引。
6.4. 添加索引后, 再次查詢Persons表的第3000000條數(shù)據(jù), 耗時(shí)0秒。
總結(jié)
- 上一篇: 012_union操作符
- 下一篇: 014_insert into sele