MySQL索引优化系列(1)—索引介绍

此后会针对数据库索引出一系列的文章,敬请期待
程序员

前言—学习索引几大理由

  • 高薪程序员必备知识,不管去哪里面试,数据库的索引优化是必考知识web

  • 工做必备,不管任何系统都要和数据库打交道,当数据量达到百万级以上,查询速度就会变慢,影响数据库的并发,从而影响总体的系统并发面试

  • 不会数据库索引的程序员,不是一个合格的程序员,因此快来学习索引吧,哈哈算法

索引是什么

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高校获取数据的数据结构。 能够获得索引的本质:索引是数据结构,索引的目的是提升查询效率,能够类比英语新华字典,若是咱们要查询MySQL这个单词,首先咱们须要在目录(索引)定位到M,而后在定位到y,以此类推找到SQL。 若是没有索引呢,那就须要从A到Z,去遍历的查找一遍,直到找到咱们须要的,一个一个找和直接根据目录定位到数据,是否是差的天壤之别呢,这就是索引的妙用。 
spring

索引底层数据结构

当数据量大的时候,索引的数据量也很大,因此索引不可能所有放到内存中,所以索引通常以文件的形式存储到硬盘上。数据库

数据自己以外,数据库还维护着一个知足特定查找算法的数据结构,这些结构以某种方式指向数据,这样就能够基于这些数据结构实现高级查找算法。微信

索引算法种类数据结构

  • B-tree索引(重点掌握,以后文章详细讲解)并发

  • Hash索引高并发

  • full-text索引

  • R-tree索引

索引的优点

  • 相似大学图书馆书目索引,提升数据检索效率,下降数据库IO成本

  • 经过索引列对数据进行排序,下降数据排序成本,下降了CPU消耗

索引的劣势

  • 实际上索引也是一张表,该表保存了主键和索引字段,并指向实体表的记录,因此索引列也是要占用空间的
  • 虽然索引大大提升了查询速度,同时却会下降更新表的速度,若是对表INSERT,UPDATE和DELETE。由于更新表时,MySQL不只要不存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整由于更新所带来的键值变化后的索引信息

  • 索引只是提升效率的一个因素,若是你的MySQL有大数据量的表,就须要花时间研究创建优秀的索引,或优化查询语句

索引分类

  • 单值索引:即一个索引只包含单个列,一个表能够有多个单列索引

  • 惟一索引:索引列的值必须惟一,但容许有空值

  • 复合索引:即一个索引包含多个列

索引语法

  • 建立一:create [unique] index indexName on tableName (columnName (length) )。
  • 若是是CHAR,VARCHAR类型,length能够小于字段实际长度;若是是

    BLOB和TEXT类型,必须指定length。

  • 建立二:alter tableName add [unique] index [indexName] on (columnName (length) )

  • 删除:DROP INDEX [indexName] ON mytable;

  • 查看:SHOW INDEX FROM table_name\G

哪些状况须要建索引

  • 主键自动创建惟一索引
  • 频繁做为查询的条件的字段应该建立索引
  • 查询中与其余表关联的字段,外键关系创建索引
  • 频繁更新的字段不适合建立索引:由于每次更新不仅仅是更新了记录还会更新索引,加剧IO负担
  • Where条件里用不到的字段不建立索引
  • 单间/组合索引的选择问题(在高并发下倾向建立组合索引)
  • 查询中排序的字段,若经过索引去访问将大大提升排序的速度
  • 查询中统计或者分组字段

哪些不适合建索引

  • 表记录太少

  • 常常增删改的表

  • 数据重复且分布平均的表字段,所以应该只为常常查询和常常排序的数据列创建索引。注意,若是某个数据列包含许多重复的内容,为它创建索引就没有太大的实际效果。

今天索引先介绍到这来,以后文章会围绕索引优化讲解

敬请期待!!!

关注微信公众号:IT老哥

回复Java全套教程,便可领取:Java基础、Java web、JavaEE所有的教程,包括spring boot等

回复:简历模板,便可获取100份精美简历

回复:Java学习路线,便可获取最新最全的一份学习路线图

回复:Java电子书,便可领取13本顶级程序员必读书籍

相关文章
相关标签/搜索