- 为什么要使用数据库索引?
- 适当使用索引可以加快数据查询速度
- 使用唯一索引可以保证数据的唯一性
- 使用索引有啥缺点
- 在增删改的时候会同步维护索引,会有一定的性能消耗
- 会多占用一定的物理空间
- 索引的底层结构
- b树和b+树
- 区别
- b树是将数据和索引放在了树的每一个节点上,而b+树在非叶子结点上存索引,叶子结点上存索引和数据
- b+树在叶子结点上有指向下一个叶子结点的指针,b树没有
- 为啥不采用hash或者普通的树
- b树是多叉树,对于同样的数据来说,hash方式会遇到hash碰撞的问题,而且由于hash没有顺序,不能够对顺序和范围查询做优化,而普通的树和b树由于一个树结点容量有限,如果将所有的索引和数据放在每一个节点上的话,势必会造成树的高度很高,而磁盘在索引数据的时候,树的深度越深,磁盘需要重新索引的次数就越多,就会导致效率低下。因此,树的高度越低,越可以减少磁盘重新索引的次数,从而提高查询效率。
- 区别
- mysql引擎用的基本上都是b+树索引
- myisam用的是b+树,其中在树的叶子结点上存储的是数据的地址。myisam的数据和索引是分开存储的。这种被称为非聚集索引。
- innodb的数据和索引是存在一起的一个文件,这种存在一起的被称为聚集索引。对于主键索引data域存储的是该条记录,对于其他的二级索引在树的叶子结点上存储的是数据的主键id。
- 叶子结点存储索引和数据的是主键索引,其他的是二级索引。也就是说,类似唯一索引,普通索引,联合索引这些都需要先根据索引查到id或者地址,然后再根据ID或地址去主键索引获取真正的数据。如果待查询数据本身就是id或者说索引的列,这就是覆盖索引,这种索引不需要二次查询。
- 覆盖索引一般可以用于字符串。
- 如果一个查询有多个索引可以命中,那么就要想办法优化索引了,因为索引越多,占用的空间和修改数据的时候需要修改的地方就越多,就会导致效率低下。
- 都有啥索引
- 主键索引
- 二级索引
- 唯一索引
- 普通索引
- 联合索引
- 全文索引
- 聚集索引:数据和索引存储在一起的是聚集索引
- 非聚集索引:数据和索引分开存储的是非聚集索引
- 什么时候使用索引(使用索引有哪些技巧)
- 对于经常查询的字段,可以将其设置为索引
- 对于经常修改的字段,最好不做索引
- 对于有null的字段,不要做索引,因为索引对null不好优化
- 对于经常在查询条件中的,可以考虑将其设为索引
- 对于经常需要排序的字段
- 对于经常在连接查询中出现的字段
- 尽可能创建联合索引而不是单列索引
- 在字符串上尽量使用前缀索引代替普通索引
- 使用索引的一些建议
- 索引对于中大表比较有效,对于特大表维护开销比较大,不适合索引
- 对于where中不要使用函数,会导致无法使用索引
- 删除不用的索引
- 使用分页参数查询较慢的时候可以考虑创建索引
- 主键索引最好使用逻辑id,不要使用业务id
- 使用方法
- alter table add primary index (id)
- alter table add index index_name (name)
- alter table add unique (name)
- alter table add index index_name (name,age)
- alter table add