八股总结----数据库(MySQL和Redis)

1.MySQL部分

11.基本写法

列出数据库:show databases;创建数据库:create database mysql_test;切换数据库:use mysql_test;列出表:show tables;创建表:create table student(s_id int,s_name varchar(8),s_birth date);表的列名在前,数据类型在后。在表中插入数据:insert into student values (1,'赵雷','1990-01-01'), (8,'王菊','1990-01-20');

12.执行一条 SQL 查询语句,期间发生了什么?

  • 连接器:建立连接,管理连接、校验用户身份;
  • 查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。
  • 解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;
  • 执行 SQL:执行 SQL 共有三个阶段:1. 预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。2. 优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划。3. 执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端。

13.索引部分

131.索引的定义

索引是数据的目录,就是帮助存储引擎快速获取数据的一种数据结构。存储引擎,说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。MySQL 存储引擎有 MyISAM 、InnoDB、Memory,其中 InnoDB 是在 MySQL 5.5 之后成为默认的存储引擎。索引和数据就是位于存储引擎中。

132.索引的分类

  • 按「数据结构」分类:B+tree索引、Hash索引、Full-text索引
  • 按「物理存储」分类:聚簇索引(主键索引)、二级索引(辅助索引)
  • 按「字段特性」分类:主键索引、唯一索引、普通索引、前缀索引
  • 按「字段个数」分类:单列索引、联合索引

为什么 MySQL InnoDB 选择 B+tree 作为索引的数据结构?这是因为:B+树和B树相比,B+Tree 只在叶子节点存储数据,而 B 树 的非叶子节点也要存储数据,所以 B+Tree 的单个节点的数据量更小,在相同的磁盘 I/O 次数下,就能查询更多的节点。另外,B+Tree 叶子节点采用的是双链表连接,适合 MySQL 中常见的基于范围的顺序查找,而 B 树无法做到这一点。B+树和二叉树相比,对于有 N 个叶子节点的 B+Tree,其搜索复杂度为O(logdN),其中 d 表示节点允许的最大子节点个数为 d 个。而二叉树的每个父节点的儿子节点个数只能是 2 个,意味着其搜索复杂度为 O(logN),这已经比 B+Tree 高出不少,因此二叉树检索到目标数据所经历的磁盘 I/O 次数要更多。B+树和Hash表相比, Hash 表不适合做范围查询,它更适合做等值的查询。

从物理存储的角度来看,索引分为聚簇索引(主键索引)、二级索引(辅助索引)。

  • 主键索引的 B+Tree 的叶子节点存放的是实际数据,所有完整的用户记录都存放在主键索引的 B+Tree 的叶子节点里;
  • 二级索引的 B+Tree 的叶子节点存放的是主键值,而不是实际数据。

主键索引就是去用一个B+树去查主键字段,叶子节点存储的是整行数据,通过主键就可以获知全部信息,而二级索引则是去查其他字段,比如学生表中的姓名、成绩等列的字段,叶子节点存储的是该二级字段以及主键,通过二级字段可以获知主键,然后通过回表去查该主键对应的整行数据,所以这种方式可能需要两个B+树才能查到数据。

133.什么时候需要索引?

134.什么时候不需要索引?

135.优化索引的办法

  • 前缀索引优化;
  • 覆盖索引优化;
  • 主键索引最好是自增的;
  • 防止索引失效;

2.Redis部分

相关推荐
岁岁岁平安17 分钟前
spring学习(spring-DI(字符串或对象引用注入、集合注入)(XML配置))
java·学习·spring·依赖注入·集合注入·基本数据类型注入·引用数据类型注入
武昌库里写JAVA20 分钟前
Java成长之路(一)--SpringBoot基础学习--SpringBoot代码测试
java·开发语言·spring boot·学习·课程设计
qq_5895681026 分钟前
数据可视化echarts学习笔记
学习·信息可视化·echarts
sdaxue.com34 分钟前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
兔C1 小时前
微信小程序的轮播图学习报告
学习·微信小程序·小程序
o(╥﹏╥)1 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
海海不掉头发1 小时前
苍穹外卖-day05redis 缓存的学习
学习·缓存
阿里嘎多学长2 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_2 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Sunyanhui12 小时前
牛客网 SQL36查找后排序
数据库·sql·mysql