乐趣区

关于mysql:老哥告诉你什么是MySQL索引

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

前言—学习索引几大理由

  • 高薪程序员必备常识,无论去哪里面试,数据库的索引优化是必考常识
  • 工作必备,无论任何零碎都要和数据库打交道,当数据量达到百万级以上,查问速度就会变慢,影响数据库的并发,从而影响整体的零碎并发
  • 不会数据库索引的程序员,不是一个合格的程序员,所以快来学习索引吧,哈哈

索引是什么

MySQL 官网对索引的定义为:索引 (Index) 是帮忙 MySQL 高校获取数据的数据结构。能够失去索引的实质:索引是数据结构,索引的目标是进步查问效率,能够类比英语新华字典,如果咱们要查问 MySQL 这个单词,首先咱们须要在目录(索引)定位到 M,而后在定位到 y,以此类推找到 SQL。如果没有索引呢,那就须要从 A 到 Z,去遍历的查找一遍,直到找到咱们须要的,一个一个找和间接依据目录定位到数据,是不是差的天壤之别呢,这就是索引的妙用。

索引底层数据结构

当数据量大的时候,索引的数据量也很大,所以索引不可能全副放到内存中,因而索引个别以文件的模式存储到硬盘上。

数据自身之外,数据库还保护着一个满足特定查找算法的数据结构,这些构造以某种形式指向数据,这样就能够基于这些数据结构实现高级查找算法。

索引算法品种

  • 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_nameG

哪些状况须要建索引

  • 主键主动建设惟一索引
  • 频繁作为查问的条件的字段应该创立索引
  • 查问中与其余表关联的字段,外键关系建设索引
  • 频繁更新的字段不适宜创立索引:因为每次更新不单单是更新了记录还会更新索引,减轻 IO 累赘
  • Where 条件里用不到的字段不创立索引
  • 单间 / 组合索引的抉择问题(在高并发下偏向创立组合索引)
  • 查问中排序的字段,若通过索引去拜访将大大提高排序的速度
  • 查问中统计或者分组字段

哪些不适宜建索引

  • 表记录太少
  • 常常增删改的表
  • 数据反复且散布均匀的表字段,因而应该只为常常查问和常常排序的数据列建设索引。留神,如果某个数据列蕴含许多反复的内容,为它建设索引就没有太大的实际效果。

明天索引先介绍到这来,之后文章会围绕索引优化解说

敬请期待!!!

退出移动版