mysql-索引
总结一下索引相关内容:
1、首先我们了解一下什么是索引?索引的本质就是一种排好序的数据结构,在查询的时候可以快速地查找到正确的数据。
2、索引的目的是什么?
- 访问数据表中的特定信息,提高检索速度
- 创建唯一性索引,保证数据库表中每一行数据的唯一性
- 加速表和表之间的连接
- 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间
3、索引是不是越多越好呢?这样是不是可以更加快速地查找到数据呢?不是的。索引是会占用物理内存的,合理的建立索引是会提高查询速度的,索引会导致增删改的速度下降,操作数据需要维护索引文件完整性
4、InnoDB底层用的数据结构时B+树,B树和B+树的区别:
B+树只有叶子节点存储数据,非叶子节点存储索引,而一个节点就是磁盘上一个内存页,内存页大小时固定的。相对于B树而言,可以存储更多的索引节点,这样的话 树高就会更矮,减少IO次数
5、索引:
普通索引、唯一索引、主键索引、全文索引、覆盖索引、联合索引
普通索引:普通索引数据可以重复 命令就是:alert table tablename add index **;
唯一索引:唯一索引数据不可以重复,但是可以为空
主键索引:主键索引也是唯一的,但是不可以为空,在innodb引擎中,主键索引作为聚簇索引排列,如果没有设置主键索引,会自动查询表中列数据不为空不重复数据作为主键,如果找不到会有隐藏列作为主键。
覆盖索引:覆盖索引就是索引字段覆盖了查询的语句涉及的字段,直接通过索引文件就可以返回查询的所有数据了,不需要重新回表查询了。
6、合理选择索引的原则:
名词:Change buffer: Change Buffer是一种特殊的数据结构,缓存对二级索引页面的更改并且这些页面不在Buffer Pool中。Change buffer的主要目的是将对二级索引的数据操作缓存下来,以此减少二级索引的随机IO,并达到操作合并的效果。缓存的changes可能由 Insert 、Delete 和 Update的结果导致
需要看表的用途读多写少、读少写多:
如果是查询比较多的情况下:数据库在查询时会以数据也为单位加载到内存中,不需要一条一条的读取磁盘,唯一所以根据条件查询数据时就返回结果了,而普通索引查询第一条记录往后遍历直到不满足条件,由于都在内存中,不需要磁盘读取那么大的开销,所以普通索引和唯一所有的查询差不多。
如果是更新比较多的情况下:唯一索引更新是需要检查诗句的唯一性,所以需要把数据页加载到内存中进行判断,此时直接操作内存,不需要操作change buffer。普通索引若是数据在内存中直接更新。若是更新多一些的话,为了减少磁盘IO,普通索引会好一些。因为普通索引可以利用 change buffer
进行性能优化减少磁盘 IO,将更新操作记到 change bufer,等查询来了将数据读到内存再进行修改
7、建立索引有哪些不好地方?
创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;
索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;
当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。
8、建立索引的原则是什么?
- 在最频繁使用的、用以缩小查询范围的字段上建立索引
- 在平频繁使用的、需要排序的字段上建立索引
9、不宜建立索引的场景
- 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引 比如:男女 字段
- 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text),值范围较少的知道等。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~