数据库什么时候建立索引合适呢??
嗯??听到这个问题的时候,是不是有些茫然?
我连什么是索引都不是很清晰明了,你给我讲什么建立索引的时机?!!!
是的,很多同学只是有所耳闻,并且可能就是只知道索引可以优化sql效率,但是至于其所以然并不清晰。那么我们现在先谈谈什么是索引。
对于MySQL而言,官方对索引给出的定义是:索引(index)是帮助MySQL高效获取数据的数据结构。
这个时候,我们可以了解到索引就是一种数据结构。
也可以通俗的理解:一种排好序等你来直接查询的快速查找的数据结构。所以上面也说道了可以优化sql的查询效率。
那么索引到底如何实现的呢?这里我们简单的说一下:
用mysql举例来说明,mysql支持多种存储引擎,那么各种存储引擎支持的索引也是不一样的。这里我们说到的mysql就支持多种:日报B-、B+Tree;hash;全文。
这里我们重点说一下:聚簇索引和非聚簇索引。(很多场景经常问)
在mysql的存储引擎中:MyISAM和innodb,其中分别实现的是非聚簇索引和聚簇索引。
对于两种索引结构来说:
聚簇索引:聚餐索引就是数据的物理存储顺序,通俗的讲,就是排队,比如一排人坐在位置上,我要他们全起立,按照你们个个座位的序号,给我排好队。这样,我叫第三个人出列,就可以直接找到了。
非聚簇索引:索引顺序与数据物理排序顺序无关。通俗的讲,就是你们虽然按序号坐着,但是我手上有一份名单,这名单的顺序是按照姓名的A-Z排序的。那么我叫第三个人出列,就可以直接看到这个人的唯一姓名了。
那么对于上面两种存储引擎,适用于什么场景呢。通常来说,非聚簇索引适合大量的读操作。聚簇索引适用于大量的增删改操作。
好,简单的索引拓展结束,我们重点说说使用索引。
建立索引的好处
那么建立索引有什么好处吗?这么讲,我们在图书馆找书的时候,是不是按照书标签去找书的,这样,即使在几百万的藏书中,我们也能找到自己要的书籍。这样在系统层面,我们降低了数据库的IO操作。通过索引,我们也不需要排序,直接就降低了排序的性能消耗。
那么坏处呢?
那么万物皆有双面性,在我们建立索引的同时,也就是说,我们还要对索引进行维护,也就是说,需要维护两套数据。且在对比哦库表进行增删改操作的时候,还需要对索引进行一个更新信息操作。从底层实现来说,索引也是一张库表,其中的数据内容就是表结构对应的索引字段,所以说索引也消耗了一定的存储空间。类似一种触发器机制。
那么说其弊端也显而易见了,就是维护的成本,和io读写。
总结来说,就是索引适合在高频的读操作中建立,且不适合高频的增删改操作。
那么最后面我们可以直接对索引进行一个使用的总结了。
在哪些场景适合使用索引呢?
1.在我们建立表的时候,其实默认已经将主键上建立唯一索引了。
2.当某个字段频繁的作为查询参数,查询条件的字段也建议使用,比如号码,唯一,且查询频率高
3.当我使用join进行一个链表查询,就适合使用,这样,外键也是一种查询条件频率高。
4.排序的字段,当我们对一些数据量较大的表进行一个查询且排序,例如日志表,都会使用到创建时间作为排序字段,并且来说,这些表的数据量都不小,这个时候,我们建立索引会有明显的效率提升。
5.还有我们做统计数据的时候,通常会对该字段进行一种数据的汇总统计,在分组查询的时候也是一样的意思,这个时候,也建议建立索引。
注:在建立索引的时候,组合索引建立比单个更有效果,但是不能贪多哦。
那么也有一些场景不建议使用索引:
1.表记录较少,你一共就10条数据,我还建立一个索引?可能索引的数据存储都比实际数据都多。
2.还有一种就是上面已经说到的,高频的增删改表。比如流水表,秒级的增加数据。这种表结构,我们通常不建议。
3.查询条件几乎用不到的字段。这个自己理解。
4.还有就是那种,你选择他作为查询条件,但是几乎没有条件过滤的感觉的字段。例如,性别,你说你查询男和女有多大的过滤??
那么后面,我们肯定得讲讲存储引擎中的B树,这个可是高频面试题。