介绍
概念
索引(index)是帮助数据库高效获取数据的数据结构
在没有索引的情况下是如何查找
是从上往下依次进行配对查找,那么找到age = 45 以后是否还需要往下找呢?如果这个age字段不是唯一的,还需要继续往下找,直到找到最后,这叫做全表扫描,如果数据很多,就会导致性能很低
那么索引所用到的数据结构是什么呢?
二叉搜索树(底层并不是二叉搜索树,原因等会会说)
索引的存在就跟书本的目录是一样的,一本书如果没有目录,当我们想找某一页内容时,会非常耗时,但是有了目录,我们就能很快定位到。
优缺点
优点:
提高数据查询的效率,降低数据库的IO成本。
通过索引列对数据进行排序,降低数据排序的成本,降低CPU消耗。
缺点:
索引会占用存储空间。
索引大大提高了查询效率,同时却也降低了insert、update、delete的效率。
结构
MySQL数据库支持的索引结构有很多,如:Hash索引、B+Tree索引、Full-Text索引等。我们平常所说的索引,如果没有特别指明,都是指默认的B+Tree结构组织的索引。
我为什么没有用二叉搜索树或者红黑树呢?
二叉搜索树容易出现一边倒的问题,红黑树虽然能解决这个问题,但是,在大数据量情况下,层级深,检索速度慢
B+Tree(多路平衡搜索树)
上面这部分叫非叶子结点,不用于保存任何数据
下面这部分叫做叶子结点,用于保存数据
B+Tree的三个特点:
每一个节点,可以存储多个key(有n个key,就有n个指针)。
所有的数据都存储在叶子节点,非叶子节点仅用于索引数据。
叶子节点形成了一颗双向链表,便于数据的排序及区间范围查询。
语法
创建索引
create [ unique ] index索引名on表名(字段名,...);
查看索引
show index from表名;
删除索引
drop index索引名on表名;
例子:
-- 创建:为tb_emp表的name字段建立一个索引.
create index idx_emp_name on tb_emp(name);
-- 查询:查询tb_emp表的索引信息.
show index from tb_emp;
-- 删除:朋除tb _emp表中name字段的索引.
drop index idx_emp_name on tb_emp;
注意事项
主键字段,在建表时,会自动创建主键索引(所有索引当中性能最高)。
添加唯一约束时,数据库实际上会添加唯一索引。