持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
什么是索引
MYSQL官方定义:索引(Index) 是帮助MYSQL高效获取数据的数据结构,也就是可以理解为:索引是数据结构。
我们可以理解为:索引的目的在于提高查询效率,可类比为字典即就是 排好序的快速查找数据结构,数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,一般来说索引本身也很大,不可能全部存储再内存中,因此索引往往以索引文件的形式存储在磁盘上。我们平常所说的索引,若果没有特别指明,都是指B树(多路搜索树,并不一定是二叉树)结构组织的索引。其中聚集索引,复合索引,前缀索引,唯一索引 默认都是使用B+树索引,统称为索引。
索引的优势
提高数据检索的效率,降低数据库的 IO成本,通过索引列对数据进行排序,降低了数据排序的成本,降低了CPU的消耗。
索引的劣势
- 索引列是占用空间的(索引也是一张表,该表保存了主键与索引字段,并指向实体表)
- 虽然索引大大的提高了查询速度,同时取回降低更新表数据的速度。因为更新操作时MYSQL不仅要更新实体表中的数据还要维护保存一下索引文件,每一次的更新都会是的索引数据键值发生失效,所以要同时维护索引文件。
- 索引只是提高效率的一个因素,如果需要创建优秀的索引,那么需要在生产环境(业务)中去多次修改多次更新以达到更高效的索引,并不是说索引创建的越多越好。不能因为创建而去创建,而是因为需要才去创建。
索引分类
- 单值索引:即一个索引只包含单个列,一个表可以有多个(建议不超过5个索引单表)单列索引(频繁查询的单个字段可以创建)
- 唯一索引:索引列必须唯一,但是允许有空值(账号,银行卡号等等)
- 复合索引:一个索引包含多个列
基本语法
3.1创建索引
//[UNIQUE] 代表可省略(不是唯一索引时)
CREATE [UNIQUE] INDEX indexName ON mytable(columnname(length))
ALTER mytable ADD [UNIQUE] INDEX [indexName] ON (columnname(length))
//添加主键,这意味着索引值必须是唯一的且不能为null
ALTER TABLE tbl_name ADD PRIMARY KEY(COLUM_list);
//索引值必须是唯一的但是可以为null即null可能会出现多次
ALTER TABLE tbl_name UNIQUE index_name(COLUM_list);
//添加普通索引,索引值可以多次出现
ALTER TABLE tbl_name ADD INDEX index_name(COLUM_list);
//全文索引
ALTER TABLE tbl_name ADD FULLTEXT index_name (COLUM_list);
测试:
3.2删除索引
DROP INDEX [indexName] ON mytable
测试:
3.3查看索引
SHOW INDEX FROM table_name
测试:
索引结构
- BTree索引
- hash索引
- full-text全文索引
- R-Tree索引
创建索引的场景
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其他表关联的字段,外键关系建立索引
- where条件用不到的字段不创建索引
- 单键索引/组合索引的选择问题(在高并下倾向创建组合索引)
- 查询中排序的字段,排序字段若通过所以去方法问将大大提高排序速度
- 查询中统计或者分组字段
不创建索引的场景
- 表中记录太少
- 频繁更新的字段不适合创建索引
- 某个数据列包含许多重复的内容,为他建立索引就没有太大的实际效果。(索引列数据有2000条 不重复记录有1900条 1900/2000=0.95 整个值越接近于1那么这个 索引的 效率就越高)