MySQL面试题
基础
MySQL执行流程
MYSQL执行流程如下:
- 建立连接:客户端与MYSQL服务器建立连接,涉及TCP/IP握手以及身份验证
- 查询缓存:查询语句可能会被查询缓存命中,如果之前执行过相同的查询,并且结果没有发生变化,则直接从缓存中返回结果
- 解析SQL:数据库系统通过解析器对SQL查询语句进行词法分析和语法分析,构建语法树
- 执行SQL:
- 预处理阶段(Preprocessing):检查表和字段是否存在,将查询中的符号扩展为实际的列。
- 优化阶段(Query Optimization ):数据库系统根据查询的成本考虑选择最优的执行计划。
- 执行阶段(Query Execution):数据库系统根据优化器选择的执行计划执行SQL查询,将符合条件的结果返回给客户端。
索引
了解过索引吗
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+树),这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法这种数据结构就是索引。
MYSQL底层采用的数据结构是B+树
B-Tree树:
B+ Tree
了解过索引吗?
- 索引(index)是帮助小ySQL高效获取数据的数据结构(有序)
- 提高数据检索的效率,降低数据库的O成本(不需要全表扫描)
- 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗 索引的底层数据结构了解过嘛?
- MySQL的InnoDB引擎采用的B+树的数据结构来存储索引
- 阶数更多,路 径更短
- 磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
- B+树便于扫库和区间查询,叶子节点是一个双向链表
聚簇索引
聚簇索引(Clustered Index)是一种特殊类型的索引,它改变了数据存储的物理结构以优化性能。在聚簇索引中,索引的键值决定了数据行在磁盘上的物理存储顺序,因此数据行的存储顺序与索引的顺序一致。
- 聚集泰l(Clustered Index)将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据,必须有,而且只有一个
- 二级索引(Secondary Index)将数据与索引分开存储,索引结构的叶子节点关联的是对应的主键,可以存在多个 聚簇索引的选取规则:
- 如果存在主键,主键索引就是聚集索引。
- 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
- 如果表没有主键,或没有合适的唯一索引,则InnoDB:会自动生成一个rowid作为隐藏的聚集索引。
回表查询 回表查询是指在使用覆盖索引(Covering Index)时,虽然索引已经包含了查询需要的所有列,但为了获取完整的结果集,数据库仍然需要通过主键或者聚簇索引回到数据表中进行进一步的查询。这种额外的查询操作被称为回表查询。
面试题回答: 什么是聚簇索引什么是非聚簇索引?
- 聚簇索引 (聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个
- 非聚簇索引(二级索):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个 知道什么是回表查询嘛?
- 通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表
覆盖索引
覆盖索引(Covering Index)是一种特殊类型的索引,它包含了查询所需的所有列,可以完全满足查询需求,而不需要额外地回到数据表中去获取数据。因此,覆盖索引可以避免回表查询,提高查询性能。
回表查询: 比如查询id,name,gender的时候,gender没有索引 ,查不到,回进行 回表查询
回答面试: 知道什么叫覆盖索引嘛?
- 覆盖索引是指查询使用了索引,返回的列,必须在索引中全部能够找到
- 使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
- 如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select*