目录
一、索引概述
索引的存储位置
索引的类型说明
索引的优势
索引的劣势
二、索引在sql中的创建、删除、查看、使用
1.索引的创建
2.删除索引
3.查看索引
三、哪些字段适合创建索引?不适合创建索引?
一、索引概述
在数据之外,数据库系统还维护着特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构之上实现高级的查找算法。这种数据结构,就是索引。
索引的存储位置
一般来说索引本身也是很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上;
索引的类型说明
我们平常所说的索引,如果没有特别指明,就是指B树(多路搜索树,不一定是二叉树)的结构组织的索引。其中聚集索引、次要索引、复合索引、唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这类索引外,还有哈希索引(hash index)等。
- 单值索引:即一个索引只包含单个列,一个表可以有多个单列索引
- 唯一索引:索引列的值必须唯一,但允许有空值,空值可以多次出现
- 复合索引:即一个索引包含多个列
索引的优势
- 类似大学图书馆建书目录,提高数据检索的效率,降低数据库的IO成本;
- 通过索引列对数据进行排序,降低数据排序的成本,降低了cpu的消耗。
索引的劣势
- 实际上索引也是一张表,该表保存了主键与索引字段,并指向实际表的记录,所以索引占空间;
- 索引虽然提高了查询数据的速度,却降低了更新表(insert\update\delete,其中delete较小)的速度【原因:更新表时,mysql不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段。都会调整更新所带来的键值变化后的索引信息。】
- 索引只是提高效率的一个因素,如果你的mysql有大量的数据表,就会需要花时间研究建立最优的索引(如:项目一开始建立索引的字段只是产品的估计用户会使用该字段进行查询,优化就需要根据用户的实际使用,在查询最多的字段上建立索引),或者优化查询。
二、索引在sql中的创建、删除、查看、使用
1.索引的创建
#[]中的关键字不填则表示普通索引,fulltext全文索引,unique唯一索引
方式主要两种,加上,另外一种主键索引的创建
1.
create [unique|fulltext] index indexname on tablename(coluname);
如:CREATE INDEX index_cateid_views ON article(category_id,views);
2.
alter table t_name add [unique|fulltext] index [indexname](coluname);
如:alter TABLE article add index index_cate_vie (category_id,views);
3.
#主键也是索引,值必须唯一,且不能为空;
alter table t_name add primary key (columname);
2.删除索引
drop index [indexname] on tablename
3.查看索引
show index from tablename
示例:
三、哪些字段适合创建索引?不适合创建索引?
- 主键自动创建唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其他表关联的字段,外键关系建立索引
- 单键/组合索引的选择?优先创建组合索引(在高并发下倾向创建组合索引)
- 查询中的排序字段应创建索引,原因:排序字段若通过索引去访问将大大提高排序速度
- 查询中统计或者分组的字段应创建索引,原因:分组本身与排序逻辑上相关,索引可以提高排序速度当然对分组利好;
- 频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录还要更新索引,加重了io成本;
- where条件用不到的字段不创建索引;
- 表记录太少,不需要创建索引
- 如果某一列的数据大量重复,也不需要创建索引,因为数据大量重复,索引没有太大的实际效果;