Sql 索引
https://www.bilibili.com/video/BV1Jt411W7Fo?from=search&seid=7557863753162983443&spm_id_from=333.337.0.0
索引存放位置
“通常,索引本身很大,不能完全存储在内存中,因此索引通常作为索引文件存储在磁盘上 。数据也放在磁盘上,访问磁盘的成本大约是访问内存的10W倍
mysql聚簇和非聚簇索引的区别
MyISAM 引擎中,B+Tree 叶节点的 data 域存放的是数据记录的地址。在索引检索的时候,首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其 data 域的值,
然后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引”
InnoDB 引擎中,其数据文件本身就是索引文件。相比 MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按 B+Tree 组织的一个索引结构,树的叶节点 data 域保存了完整的数据记录。
这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”
而其余的索引都作为辅助索引(二级索引),辅助索引的 data 域存储相应记录主键的值而不是地址(非聚集索引的叶子节点是不存放数据的),这也是和 MyISAM 不同的地方。
在根据主索引搜索时,直接找到 key 所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引(回表查询)。
因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂
聚簇索引的优点:
聚集索引的查询速度非常的快,因为整个 B+树本身就是一颗多叉平衡树,叶子节点也都是有序的,定位到索引的节点,就相当于定位到了数据。
缺点:
- 依赖于有序的数据 :因为 B+树是多路平衡树,如果索引的数据 (data)不是有序的,那么就需要在插入时排序,如果数据是整型还好,否则类似于字符串或 UUID 这种又长又难比较的数据,插入或查找的速度肯定比较慢。
- 更新代价大 : 如果对索引列的数据被修改时,那么对应的索引也将会被修改,而且聚集索引的叶子节点还存放着数据,修改代价肯定是较大的,所以对于主键索引来说,主键一般都是不可被修改的
非聚簇索引的优点:
更新代价比聚集索引要小 。非聚集索引的更新代价就没有聚集索引那么大了,非聚集索引的叶子节点是不存放数据的
非聚集索引的缺点
- 跟聚集索引一样,非聚集索引也依赖于有序的数据
- 可能会二次查询(回表) :这应该是非聚集索引最大的缺点了。 当查到索引对应的指针或主键后,可能还需要根据指针或主键再到数据文件或表中查询
非聚集索引一定回表查询吗(覆盖索引)?
非聚集索引不一定回表查询。
主键索引本身的 key 就是主键,查到返回就行了。这种情况就称之为覆盖索引了
如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为“覆盖索引”
索引是什么
索引是对数据库表中一列或多列的值进行排序的一种结构
查询50W条数据是0.106s 而索引可以轻易的将查询性能优化几个数量级
索引不是必须的
索引原理
顺序结构---树结构 查询高效
索引分类
唯一索引,一种索引,不允许具有索引值相同的行,从而禁止重复的索引或键值。系统在创建该索引时检查是否有重复的键值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。
主键索引是一种特殊的唯一索引,一个表只能有一个主键且不允许有空值;索引列的所有值都只能出现一次,即必须唯一
按数据结构分类可分为:B+tree索引、Hash索引、Full-text索引。
按物理存储分类可分为:聚簇索引、二级索引(辅助索引)二级索引的叶子节点存储的数据是主键。唯一索引,普通索引,前缀索引等索引属于二级索引.二级索引属于非聚集索引
按字段特性分类可分为:主键索引(数据表的主键列使用的就是主键索引)、普通索引、前缀索引。
按字段个数分类可分为:单列索引、联合索引(复合索引、组合索引)。
create index name on table(id,name);
create unique index name on table(name);
drop index name on table;
- 前缀索引(Prefix) :前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,相比普通索引建立的数据更小, 因为只取前几个字符。
- 全文索引(Full Text) :全文索引主要是为了检索大文本数据中的关键字的信息,是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引,5.6 之后 InnoDB 也支持了全文索引。
mysql InnoD的默认索引为B+ Tree
创建唯一索引后,冲突数据无法添加
主键索引一定是唯一索引,反之并不成立
索引的数据结构
各自特点
hash 索引 本身是无序的 。需要把所有数据文件添加到内存,耗费内存空间。
隐藏索引
将索引隐藏,隐藏的索引对优化器不可见。生成查询计划时便不使用这个索引。
作用:我们有时会删除某个索引,但发现这个索引时有用的,就要重新建立。那么在较大的表来说,删除、重建索引的成本是很高的。
因此有了隐藏索引就方便多了。
索引的优点
索引的缺点
何时索引会失效
模型数空运最快
1. 模糊查询
正常情况下模糊查询%后置索引是有效的,%前置的话,会导致索引失效。
https://blog.csdn.net/weixin_45157630/article/details/90766877?spm=1001.2101.3001.6650.15&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-15-90766877-blog-120980363.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-15-90766877-blog-120980363.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=19
2.数据类型出现隐式转化
3.使用内部函数
4 索引不能存储空值
5.+-*、 运算
6.复合索引不满足最左匹配原则
7.全表扫描更快的话,不会使用索引
or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
简述联合索引和最左匹配原则
联合索引是指对表上的多个列的关键词进行索引。
对于联合索引的查询,如果精确匹配联合索引的左边连续一列或者多列,则mysql会一直向右匹配直到遇到范围查询(>,<,between,like)就停止匹配。Mysql会对第一个索引字段数据进行排序,在第一个字段基础上,再对第二个字段排序。
创建索引的注意事项
1.选择合适的字段创建索引:
- 不为 NULL 的字段 :索引字段的数据应该尽量不为 NULL,因为对于数据为 NULL 的字段,数据库较难优化。如果字段频繁被查询,但又避免不了为 NULL,建议使用 0,1,true,false 这样语义较为清晰的短值或短字符作为替代。
- 被频繁查询的字段 :我们创建索引的字段应该是查询操作非常频繁的字段。
- 被作为条件查询的字段 :被作为 WHERE 条件查询的字段,应该被考虑建立索引。
- 频繁需要排序的字段 :索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。
- 被经常频繁用于连接的字段 :经常用于连接的字段可能是一些外键列,对于外键列并不一定要建立外键,只是说该列涉及到表与表的关系。对于频繁被连接查询的字段,可以考虑建立索引,提高多表连接查询的效率。
- 聚合函数对聚合字段添加索引
2.被频繁更新的字段应该慎重建立索引。
虽然索引能带来查询上的效率,但是维护索引的成本也是不小的。 如果一个字段不被经常查询,反而被经常修改,那么就更不应该在这种字段上建立索引了。
3.尽可能的考虑建立联合索引而不是单列索引。
因为索引是需要占用磁盘空间的,可以简单理解为每个索引都对应着一颗 B+树。如果一个表的字段过多,索引过多,那么当这个表的数据达到一个体量后,索引占用的空间也是很多的,且修改索引时,耗费的时间也是较多的。如果是联合索引,多个字段在一个索引上,那么将会节约很大磁盘空间,且修改数据的操作效率也会提升。
4.注意避免冗余索引 。
冗余索引指的是索引的功能相同,能够命中索引(a, b)就肯定能命中索引(a) ,那么索引(a)就是冗余索引。如(name,city )和(name )这两个索引就是冗余索引,能够命中前者的查询肯定是能够命中后者的 在大多数情况下,都应该尽量扩展已有的索引而不是创建新索引。
5.考虑在字符串类型的字段上使用前缀索引代替普通索引。
前缀索引仅限于字符串类型,较普通索引会占用更小的空间,所以可以考虑使用前缀索引带替普通索引
索引命中怎么查
possible_keys
指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用
Key
key列显示MySQL实际决定使用的键(索引)
如果没有选择索引,键是NULL。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2020-02-06 pycharm 使用时遇到的问题