MySQL索引的优缺点

优点:

  • 查询起来就是快,因为MySQL的索引底层用的是B+树存储的,这种存储方式查询起来就是快.
  • 具体为什么底层采用B+树进行存储请参考我的另一篇文章
    https://www.jianshu.com/p/99aabf9611a3
  • 通过唯一索引,可以保障数据库表中每一行数据的唯一性
  • 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间

缺点:

  • 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大。
  • 对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件,而且它还要把这些改动写入索引文件。所以为每一列都创建索引非常不明智

字段适合创建索引场景:

  • 经常需要搜索的列,加上索引,速度提升,select a
  • 在主键的列上面,底层会自动创建主键索引,强制该主键底层排列顺序
  • 在经常用在连接的列,加上索引能够加快查询速度
  • 在经常范围查找的列加上索引,因为索引底层用的是B+树存储,查询起来会非常快.
  • 对于经常需要排序的列上面加索引,索引已经排好序了
  • where语句后面的列加上索引,因为索引排好序了,查找非常快

但是这里要注意的是,假如select * from emp where empno>10 and deptid>10
这个如果创建索引的话,只是empno创建索引或者deptid创建索引,都会造成索引失效,只有两个都创建了索引,才能够生效,其实很好理解,就好比两个人绑腿跑步,只有都快,才能快,有一个慢,那就跑不起来.联合索引了解一下

字段不适合创建索引场景:

  • 平时查询很少用到的列,或者参考得列,这些列很少用到,因为索引的创建和维护需要时间和空间,会影响到插入效率,

  • 比如员工性别列,不适合添加索引,索引底层是B+树,这个并不能起到提升查询速度效果,差别不大

  • 修改场景>查询场景的列,不适合创建索引,

  • 对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少(bit只有0,1,这个不就和性别类似吗,举一反三)

MySQL的索引种类

  • 主键索引(PRIMARY_KEY)
    即MySQL创建主键默认是索引,所以查询索引字段很快,不允许有空值。
    alter table table_name add primary key('column_name')

  • 唯一索引(UNIQUE /UNIQUE KEY)
    即唯一约束,主键默认就是默认唯一的,可以有NULL
    alter table table_name add unique('column_name')

  • 全文索引(FULLTEXT)
    网上说只支持MyISAM引擎,但是实际上INNODB和MyISAM引擎都支持,类型为CHAR、VARCHAR ,TEXT ,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。
    alter table table_name add fulltext (column )

  • 普通索引(INDEX)
    创建一个普普通通的索引
    alter table table_name add index index_name ( column_name )

  • 联合索引,多列索引(index)
    给多个列创建索引,使用组合索引时遵循最左前缀集合。
    alter table table_name add index index_name ( column_name, column_name2)

你可能感兴趣的:(MySQL索引的优缺点)