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