当前位置: 首页 > news >正文

INnoDB(索引与算法)

image-20220831073828336

索引与算法

InnoDB存储引擎支持&常见索引

  1. B+树索引

  2. 全文索引

  3. hash索引

B+ 树索引不能给具体行数据,索引只能找到行所在的页,读到内存之后,再进行查找

mysql5.5之前(不包括5.5)增加索引流程

  1. 创建临时表

  2. 原始数据导入临时表

  3. 删除原表

  4. 修改临时表为原来表名

缺点:大表的索引添加修改,需要很长时间,且修改时间内数据库不可用

InnoDB1.0.x解决了这个痛点问题

​ 解决方案:引入FIC(快速索引创建)

  1. 创建索引的表上增加S锁(不需要重建表)
  2. 添加S锁期间,只能读操作
  3. 删除索引,只需要存储引擎更新内部视图,将辅助索引标记为可用
  4. FIC 仅限于辅助索引,主键操作依旧需要重建表

OSC(在线架构改变)

Online DDL

FIC 可以避免InnoDB创建临时表,提高索引创建的效率,但是会阻塞DML,OSC也没有完美解决这个问题,mysql5.6开始支持Online DDL

  1. 辅助索引的创建与删除
  2. 改变自增长
  3. 添加或者删除外键约束
  4. 列的重命名

MRR(减少磁盘随机访问,转化为相对有序的访问)

  1. mysql 5.6开始支持MRR
  2. 适用范围 range ref eq_ref
  3. 优势
    1. 使数据访问相对有序,查询辅助索引时,根据查询结果按照主键排序,按照主键排序顺序进行查找
    2. 减少缓冲池中页被替换的次数
    3. 批量处理对键值对的查询操作
  4. MRR工作原理
    1. 查询得到的辅助索引放到缓存里面(根据辅助索引键值对排序)
    2. 缓存中键值对按照RowID排序
    3. 根据RowID排序顺序实际访问数据文件
    4. 缓冲池不够大的时候 MRR会失效

ICP(根据索引进行查询的优化模式)

  1. mysql5.6之后开始支持
  2. ICP工作原理
    1. 根据索引查找记录,然后直接根据where条件过滤数据(过滤数据操作在引擎层操作)
  3. ICP使用范围:
    1. myidsam引擎&InnoDB引擎
    2. 支持 range,ref,eq_ref,ref_or_null类型查询

哈希算法

哈希表(散列表)
  1. 解决hash碰撞采用链表法
InnoDB存储引擎的哈希算法
自适应哈希索引
  1. DBA无法干预
  2. 只能用来搜索等值查询

全文检索

  1. InnoDB引擎1.2.x支持,myisam支持
  2. InnoDB存储全文检索索引限制
    1. 每张表只能有一个全文索引的索引
    2. 多列组合而成的全文索引的索引列必须使用相同的字符集和排列规则
    3. 不支持没有单词界定符的语言(中文,日文,韩语)
倒排索引
  1. 辅助表存储单词与单词自身在的一个或者多个所在位置的映射
    1. 位置存储的是位置数组

相关文章:

  • docker常见面试题
  • 第09章 MyBatisPlus实现查询功能
  • 第06章 MyBatisPlus概述
  • C语言-结构体
  • GlusterFS基本概念
  • Java 键盘输入n个数进行排序输出
  • Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第10章 Vuex状态管理 10.7 Vuex实例之登录退出
  • SpringBoot基础篇 (2)— REST讲解
  • 一次JAVA频繁写大文件的记录
  • 第16章大数据定制篇-Shell编程
  • 【Push Kit】推送返回80100016错误
  • 《三叶虫与其他故事》我的恐惧如涟漪扩散,荡漾过百万年的时光
  • 阿里云maven仓库地址
  • 【ENOVIA】MBOM经理概述 | 达索系统百世慧®
  • Gradle使用教程
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Debian下无root权限使用Python访问Oracle
  • Java应用性能调优
  • Next.js之基础概念(二)
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • SQLServer之创建数据库快照
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 阿里研究院入选中国企业智库系统影响力榜
  • 闭包--闭包之tab栏切换(四)
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 蓝海存储开关机注意事项总结
  • 面试总结JavaScript篇
  • 巧用 TypeScript (一)
  • 使用putty远程连接linux
  • 小程序开发之路(一)
  • 在Mac OS X上安装 Ruby运行环境
  • 转载:[译] 内容加速黑科技趣谈
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #NOIP 2014#Day.2 T3 解方程
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (一)SpringBoot3---尚硅谷总结
  • (转)scrum常见工具列表
  • (转载)PyTorch代码规范最佳实践和样式指南
  • ****Linux下Mysql的安装和配置
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .gitignore文件---让git自动忽略指定文件
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET 5种线程安全集合
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net core 6 redis操作类
  • .NET Micro Framework初体验(二)
  • .net6使用Sejil可视化日志
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)