记面试中问到的MySQL的SQL调优问题
目录
- 1、场景还原
- 2、名词解释
- 3、实践情况
- 4、个人观点
- 5、引申问题
1、场景还原
面试官:小伙子,听说你会SQL调优,那我这里有一条SQL,你来帮我调优一下。SQL如下:
SELECT * FROM T LIMIT 899999, 10;
表结构如下:
id int(10) primary key,
其他字段……
我:¿¿¿(缓缓打出反问号),这条SQL要干嘛,随机找10条数据吗?
面试官:哦,不好意思,忘记加上排序了
SELECT * FROM T ORDER BY id LIMIT 899999, 10;
我:如果id是连续不中断的话可以这样写。 SQL如下:
SELECT * FROM T where id >= 899999 LIMIT 0, 10;
面试官:那假如id不是连续的呢?
我:(略加思考)单从SQL优化层面我优化不了了。
面试官:……那我们进行下一个话题……
我:……
面试官:那最后你有什么问题想问我的吗?
我:刚才那条SQL从SQL层面上该如何优化?
面试官:你可以这样写:
SELECT * FROM T t where t.id >= (SELECT f.id FROM T f ORDER BY id DESC LIMIT 899999, 1) LIMIT 0, 10;
我:(假装略加思考)你确定这样写会比图一这条SQL:SELECT * FROM T ORDER BY id LIMIT 899999, 10;
更快吗?在图一的SQL里已经是通过主键索引去查询数据了,你图二的SQL并没有改变原有的查找方式。如果你原有SQL是通过其他字段去排序的,用的是非主键索引,例如:SELECT * FROM T ORDER BY createdTime LIMIT 899999, 10;
那么你第二条SQL的写法确实会比第一条SQL快得多,因为在MySQL里非主键索引与主键索引在查找上的区别是,非主键索引他存储的是索引列与主键列的值,查找具体的值还需要一次回表过程,而主键索引存储了是整行数据,不需要再次***回表***[^①]查找,减少了一次查找过程。
面试官:……
我:……
2、名词解释
回表
指查找时通过非主键索引(非聚簇索引)去查找对应的记录的主键后,仍需要根据主键进行再一次的查找,这是MySQL的索引结构引起的。在MySQL中,主键索引(聚簇索引)存储的是一整行的数据,而非主键索引(非聚簇索引)存储的是主键列的值。
假如有这样一张表
CREATE TABLE person (id int(11) NOT NULL,name varchar(32) NOT NULL,age int(11) NOT NULL,PRIMARY KEY (id),KEY idx_person_age (age)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
那这张表的索引具体表现形式如下:
主键索引:
非主键索引:
所以当我们需要查找age=30的数据时,他的查找过程如下图:
3、实践情况
如今我有这样一张表:
CREATE TABLE file (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL,created_time datetime NOT NULL,updated_time datetime NOT NULL,PRIMARY KEY (id),KEY idx_file_created_time (created_time) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=954185 DEFAULT CHARSET=utf8mb4;
表的数据数量为:
先来看看面试官说的情况
可以看出,查询时间并没有很大的差距,这是因为这两条SQL都是走的主键索引,方式并没有很大的差别
而我列举的情况,通过时间字段进行排序,让其产生回表操作的过程。
可以看出,查询时间出现了很大的差距,这是由于回表操作所造成的。
4、个人观点
这个场景就发生在我上星期的面试中,我不知道这个面试官出这个题时是故意留坑还是什么情况,但是在后面他给出他那答案时,实在是让我惊讶,希望他是一时的错误,若是他对SQL的本身理解就不熟悉,那就……………………
5、引申问题
(1)在file表中,假如我所查询的数据列只有id、created_time与updated_time,那么还可以怎么做?
(2)当真的只能通过id进行排序分页时,我们该怎么做?
记面试中问到的MySQL的SQL调优问题相关推荐
- Mysql排序添加名词_记面试中问到的MySQL的SQL调优问题
目录 1.场景还原 2.名词解释 3.实践情况 4.个人观点 5.引申问题 1.场景还原 面试官:小伙子,听说你会SQL调优,那我这里有一条SQL,你来帮我调优一下.SQL如下: SELECT * F ...
- MySQL慢SQL调优
前言 在日常开发工作中,数据库是常用的数据存储组件,一旦使用了数据库,那慢查询SQL的优化是绕不开的一道坎,本文旨在分享下自己对平时开发工作中进行SQL调优的理解.本文使用的MySQL版本为 8.0. ...
- MYSQL 之 SQL 调优
SQL 调优 不适用子查询 SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang'); 子查询在 MYSQL5.5 版 ...
- 【MySQL】sql调优实战教学
如何定位并优化慢查询Sql? 具体场景具体分析只提出大致思路,其实这个问题属于开放性的题目,主要考察有没有做过SQL优化,由于该问题属于经验的问题,做过了就是做过了没做过就是没做过,问了你就知道是没有 ...
- mysql 常用sql调优_MySQL 常用SQL优化
MySQL 常用SQL优化: 一.大批量插入数据: 1.对于load MyISAM存储引擎的表,可以通过关闭打开MyISAM表非唯一索引的更新来提升导入速度: 例:mysql > alter t ...
- 面试官问:如果MySQL引起CPU消耗过大,你会怎么优化
转载自 面试官问:如果MySQL引起CPU消耗过大,你会怎么优化 谁在消耗cpu? 用户+系统+IO等待+软硬中断+空闲 祸首是谁? 用户 用户空间CPU消耗,各种逻辑运算 正在进行大量tps 函数 ...
- Mysql高级调优篇——第五章:Sql调优在面试中深度剖析
上节讲了Sql调优实战,本章聊聊面试中Sql调优深度的剖析场景! 在讲之前我们先做一些准备工作,建立一些需要用到的表: Mysql高级调优篇表补充--建表SQL_风清扬逍遥子的博客-CSDN博客⭐️t ...
- UI设计师在面试中问到频率最高的五个问题!
对于面试者而言,面试中的表现决定了这场面试的成败.尤其是在面对面试官的提问时,更应该慎重,很多问题面试官问的看似平常,实际上可以从你的回答中推测出他们想要的答案.针对UI设计初学者们反馈的问题,我总结 ...
- Mysql数据库性能调优面试大全经典分析
1.为啥要死磕Mysql Mysql作为一款大众免费开源的关系型数据库软件,受到国内很多"穷屌丝"企业的热烈欢迎,看一下目前最新数据库排行,Mysql排在第二位,仅此于Oracle ...
最新文章
- 北大清华合力打造通用人工智能实验班
- 开源网络备份软件bacula(安装bacula)
- 机甲才是男人的浪漫 这款Python版免费战争机甲类游戏,“白拿党”还在等什么?(超帅气)
- wxWidgets:wxProcess类用法
- C语言单片机数码管a段亮,各位大神,如何用C语言实现在数码管上实现1234同时亮...
- 【若依(ruoyi)】表格图片预览功能图片超宽、超高问题
- linux驱动(七)gpiolib库详解
- Codeforces 527C Glass Carving (最长连续0变形+线段树)
- 亚信安全发布《2022年网络安全发展趋势及十大威胁预测》
- python tricks —— datetime 删除日期中的前导 0
- 加载字典文件,扫描网站潜在目录
- Msm8960(APQ8064)平台的MSM-AOSP-kitkat编译适配(3):寻找正确的代码版本
- java 读文件内容_Java 如何读取txt文件的内容?
- RecyclerView通用适配器
- java jca_Java加密体系结构(JCA)参考指南
- 电商设计——3、点线面及光影
- 空调老大易主后,格力能否下定决心多元化?
- ORACLE几个关于工作日数的函数(原创)
- 使用豆瓣音乐API笔记
- 劲乐园合歌(幽灵圣典+飞吧喜鹊+唯一+v3+幽灵圣典2)铃声 劲乐园...
热门文章
- 读《鬼谷子的局》笔记
- php 当地天气预报,PHP调用全国天气预报数据接口查询天气示例
- python使用循环求斐波那契的第n项_深市收盘价如何确定,沪深股市收盘价怎样确定...
- C# Linq中 WherT 和SelectT 的区别
- 计算机二级补录成绩,成考没考过怎么办有补录机会吗
- 关于Freesurfer6.0海马体的分割环境以及步骤
- 薄荷英语---《心理学》20180823
- oracle如何查询授权,oracle授权查询
- 计算机动漫与游戏技术工资,计算机动漫与游戏制作专业是学什么的
- NAS:以数据为中心的数据存储模式[zt]