索引基础
大约 3 分钟
索引基础
索引是什么
索引:是存储引擎提高查询的数据结构
索引的核心/目的:提高查询的速度
索引的好处和坏处
当表中的数据量到达几十万甚至上百万的时候,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相比效率太低,因此文本的搜索很少在后台数据库上搜索,用的比较少