013_索引
1. 索引介紹
1.1. 您可以在表中創建索引, 以便更加快速高效地查詢數據。
1.2. 打個比方, 如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話, 那么沒有設計和使用索引的MySQL就是一個人力三輪車。
1.3. 用戶無法看到索引, 它們只能被用來加速搜索/查詢。
1.4. 索引分單列索引和組合索引。單列索引, 即一個索引只包含單個列。組合索引, 即一個索引包含多個列。
1.5. 創建索引時, 你需要確保該索引是應用在SQL查詢語句的條件(一般作為where子句的條件)。
1.6. 實際上, 索引也是一張表, 該表保存了主鍵與索引字段, 并指向實體表的記錄。
1.7. 上面都在說使用索引的好處, 但過多的使用索引將會造成濫用。因此索引也會有它的缺點: 雖然索引大大提高了查詢速度, 同時卻會降低更新表的速度, 如對表進行insert、update和delete。因為更新表時, MySQL不僅要保存數據, 還要保存一下索引文件。
1.8. 建立索引會占用磁盤空間的索引文件。
2. 普通索引
2.1. 這是最基本的索引, 它沒有任何限制。
2.2. 創建普通索引
create index `indexname` on `tablename` (`columnname`);
2.3. 修改表結構添加普通索引
alter table `tablename` add index `indexname` (`columnname`);
2.4. 創建表的時候直接指定
create table `tablename` ( ?
`id` int(11) not null, ??
`username` varchar(16) not null, ??
index `indexname` (`username`) ??
); ?
3. 唯一索引
3.1. 唯一索引與普通索引類似, 不同的就是索引列的值必須唯一, 但允許有空值。如果是組合索引, 則列值的組合必須唯一。
3.2. 創建唯一索引
create unique `indexname` on `tablename` (`columnname`);
3.3. 修改表結構添加唯一索引
alter table `tablename` add unique index `indexname` (`columnname`);
3.4. 創建表的時候直接指定
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命令來列出表中的相關的索引信息。可以通過添加\G來格式化輸出信息。
show index from `tablename`; \G
6. 索引查詢
6.1. 創建一張Persons表, 同時插入400多萬條數據。
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條數據, 耗時3秒多。
6.3. 給Persons表添加索引。
6.4. 添加索引后, 再次查詢Persons表的第3000000條數據, 耗時0秒。
總結
- 上一篇: 012_union操作符
- 下一篇: 014_insert into sele