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),值范围较少的知道等。

 

  

 

 

 

 

  

 

posted @   核桃MM  阅读(86)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示