跳至主要內容

索引基础

张威大约 3 分钟mysqlmysql索引

索引基础

索引是什么

索引:是存储引擎提高查询的数据结构

索引的核心/目的:提高查询的速度

索引的好处和坏处

当表中的数据量到达几十万甚至上百万的时候,SQL查询所花费的时间会很长,导致业务超时出错,此时就需要用索引来加速SQL查询。

由于索引也是需要存储成索引文件的,因此对索引的使用也会涉及。如果索引创建过多,使用不当,会造成SQL查询时,进行大量无用的磁盘I/O操作,降低了SQL的查询效率,适得其反,因此掌握良好的索引创建原则非常重要!

  • 使用索引也会涉及磁盘IO的

好处:提高查询的效率

缺点:

  • 。有时候索引占用的空间甚至比数据占用的空间还多。
  • 虽然索引大大提高了查询的速度,但同时也。因为数据库不仅仅要更新数据,还要更新对应的索引信息。

索引不是越多越好! 过多的索引会由于数据的改变,会造成索引文件的改动,过多的磁盘I/O造成CPU负荷太重; 索引太少,查询速度会变慢。我们应该建立合适的索引,找到一个平衡点!

索引的分类

物理(真实存在的)上:聚集索引、非聚集索引

逻辑(抽象出来的)上:

  • 普通索引/二级索引:没有任何限制条件,可以给任何类型的字段创建普通索引
    • 主要是相对于主键索引和唯一索引的说法
    • 创建新表时和已创建的表都可以加索引
    • 数量是不限的,但并非越多越好
    • 一张表一次sql查询只能用一个索引,索引看 where字段而不是select字段where a=1 and b='M'
  • 唯一索引:使用UNIQUE修饰的字段,值不能够重复,主键索引就隶属于唯一性索引
    • 不能重复,可以为空。[完整性约束/约束条件 | 张威的编程学习笔记 (gitee.io)](https://iszhwei.gitee.io/mysql/01 MySQL基础/完整性约束.html)
  • 主键索引:使用Primary Key修饰的字段会自动创建索引(MyISAM, InnoDB)
    • 没有加主键时,innodb会自动增加一个int字段当主键索引,而myisam不会
    • 不能重复,不能为空,唯一标识
  • 单列索引:在一个字段上创建索引
  • 多列索引:在表的多个字段上创建索引
    • uid+cid多列索引必须使用到第一个列,才能用到多列索引,否则索引用不上
      • 只用uid或者uid+cid都可以用到多列索引
      • 只用cid不会使用到多列索引
  • 全文索引:只有myisam支持,使用FULLTEXT参数可以设置全文索引,只支持CHAR,VARCHAR和TEXT类型的字段上,常用于数据量较大字符串类型上,可以提高查询速度
    • 评论字符串搜索,如果不加索引就会变成字符串匹配
    • 线上项目支持专门的搜索功能,给后台服务器增加专门的搜索引擎支持快速高效的搜索 **elasticsearch 简称es **JAVA实现的,使用的时候简单配置调用API接口即可实现高可用的搜索
    • C++开源的搜索引擎 搜狗的workflow
      • 因为和es相比效率太低,因此文本的搜索很少在后台数据库上搜索,用的比较少