Mysql--谈谈自己对索引的理解


从下面几点回答:

  1. 索引是什么? (是单独存储在磁盘上的一种数据库结构。能加快数据查询的速度)
  2. 索引的底层数据结构包括 B+树索引,B 树索引,还有哈希索引等。在不同的存储引擎中的存储形式是不同的。而且存储引擎也不一定支持所有的索引类型。
  3. 索引的优缺点

参考回答

  • 索引是什么

嗯,索引是单独存储在磁盘上的一种数据库结构,它呢主要是为了提高数据查询的速度,因为当数据量很大的时候,如果没有索引,那数据库进行查询的时候会进行全表扫描,会非常慢。而引用了索引之后,比如 B+树索引,它的底层是平衡搜索二叉树,查询的效率会提高很多,时间复杂度大概在 O (logn)。

(如果可以的话就继续扯下面的)

  • 索引的底层数据结构

索引的底层数据结构包括,B+树索引,B 树索引,还有 Hash 哈希索引这几种主要的。在不同的存储引擎之间的默认数据结构是不同的。比如 Memory 数据引擎,是基于内存的,额外一提这种数据引擎比较适合创建临时表。回来继续,这个数据引擎其索引的数据结构就是哈希索引。而 Msyql 再 5.5 之后的默认存储引擎 InnoDB 和另一个存储引擎 MyIsam ,默认使用的索引数据类型是 B+树索引。

其实可以拿 B+树索引来看,B+树本身是一个平衡搜索二叉树,它的特点是只有叶子节点存储数据,非叶子节点只存储主键或者其他字段以及指针,用来快速定位所需要查询的数据,而且由于叶子节点之间通过双向链表进行连接,可以更方便的进行范围查询。

再看 B 树索引,B 树是 B+树的前身,因此可以说它是 B-树。B 树的话,不只是叶子节点存储数据,而是所有节点都存储数据,这样在查询的时候,可能最快只需要一次 IO 就可以拿到数据,而 B+树索引则需要依次判断,最后到叶子节点才能拿到数据,从这里看,其实 B 树的 IO 效率会更高一些。

  • 索引的优缺点

优点:

  1. 通过建立唯一索引,可以保证数据的唯一性,这点在我的项目里就有很大用处,因为要保证短链接以及短链接访问记录等的唯一性,可以减少很多查询的次数。
  2. 刚才说过了,索引能够极大的提高数据查询的效率,原因在上面。
  3. 在分组查询和排序的过程中使用索引也能加快速度。

缺点:

  1. 创建索引以及维护索引是比较麻烦的,只要数据表数据更新时,索引可能需要对插入的数据进行存储,这时候树为了保证数据有序,可能就需要进行动态调整,所以维护比较麻烦。而且创建索引会占用一定的存储空间。

唯一索引应用(自己的项目):

/**
 * 记录基础访问监控数据
 */
@Insert("INSERT INTO t_link_access_stats (full_short_url, gid, date, pv, uv, uip, hour, weekday, create_time, update_time, del_flag) " +
        "VALUES( #{linkAccessStats.fullShortUrl}, #{linkAccessStats.gid}, #{linkAccessStats.date}, #{linkAccessStats.pv}, #{linkAccessStats.uv}, #{linkAccessStats.uip}, #{linkAccessStats.hour}, #{linkAccessStats.weekday}, NOW(), NOW(), 0) ON DUPLICATE KEY UPDATE pv = pv +  #{linkAccessStats.pv}, " +
        "uv = uv + #{linkAccessStats.uv}, " +
        " uip = uip + #{linkAccessStats.uip};")
void shortLinkStats(@Param("linkAccessStats") LinkAccessStatsDO linkAccessStatsDO);

希望能够熟练的讲清楚吧,能想出来,但回答不好肯定不行….


文章作者: KTpro
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 KTpro !
评论
  目录