索引:索引是基于字段建立的,是对数据库中一列或者多列的值进行排序的一种结构,经常查询素银列中的数据是,才需要在表上创建索引。
MyISAM 采用B+树索引
多路查找
顺序遍历
- 数据和索引分离开,叶子节点存放数据的地址,依靠地址查找数据,
- 索引值在非叶子上存放,叶子节点地址存放索引的数据,
- 存放的数据非常离散,则为非聚集索引。
- 时间复杂度:log(3n)
主索引:索引项不可重复,主键/唯一键
辅助索引:索引项数据可以重复,叶子节点依旧存储数据项的地址
InnoDB 采用B+树索引
- 把索引当成数据的一部分来存储,即索引与数据在一起,称之为聚集索引
- 叶子节点上存放真正的数据
- 数据的存放依赖于索引的存放
有主键,以主键为索引,没有主键,就以唯一键建立索引,两个都没有时添加隐藏字段 6个字节,autoincreament类型,没插入一条数据,子字段加一。
主索引:存放数据,主键不能重复
辅助索引:遍历两次查询,不存放真实的数据,叶子节点存放主索引的索引值,
索引的分类
1、普通索引:在普通的字段上建立的索引,字段可以重复
- creat index <索引的名字> ON tablename(列的列表)
- alter table tablename add index[索引的名字](列的列表)
- create table tablename([....],index[索引的名字](列的列表))
2.主键索引:索引列的值必须唯一,且不能有空值,唯一标识表中的每一行
3.唯一索引:索引列的值必须唯一,但允许有空值(注意和主键不同)
4.全文索引:mysql支持(MyISAM支持全文索引)大容量数据表耗时耗硬盘3,InnoDB不支持
5.组合索引:多个字段共同构成唯一的标识,满足最左前缀原则,从左向右依次包含
索引的建立是以空间换时间的方法建立,索引使用场景
1.那种情况下应该建立索引
- 查询频繁的字段,加快查询速度
- 按照范围查询
- 经常用于连接的字段
- 经常需要排序
2.那种情况不应该建立索引
- 查询较少
- 数据值的列很少,深度小,广度大,例如性别索引。
- text image和bit数据量要么太大要么太小,
- 修改操作多于检索操作,底层的结构随着数据的改变不停的在调整。
索引注意事项
- 索引不会包含NULL的值,使用NULL查询为顺序遍历
- 短索引:速度快,节省空间,IO效率高
- like语句:模糊匹配,like “%aaa%” 不会使用索引,而like “aaa%”可以使用索引
- 不要在列上进行运算,所有的运算函数在遍历的时候是顺序遍历,