接上篇!!!

2. SQL的生命周期?

(1)应用服务器与数据库服务器建立一个连接

(2)数据库进程拿到请求sql

(3)解析并生成执行计划,执行

(4)读取数据到内存并进行逻辑处理

(5)通过步骤一的连接,发送结果到客户端

(6)关掉连接,释放资源

3. 大表数据查询,怎么优化

(1)优化shema、sql语句+索引;

(2)第二加缓存,memcached, redis;

(3)主从复制,读写分离;

(4)v垂直拆分,根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;

(5)水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key, 为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;

4. 超大分页怎么处理?超大的分页一般从两个方向上来解决

(1)数据库层面,这也是我们主要集中关注的(虽然收效没那么大),类似于select * from table where age > 20 limit 1000000,10这种查询其实也是有可以优化的余地的. 这条语句需要load1000000数据然后基本上全部丢弃,只取10条当然比较慢. 当时我们可以修改为select * from table where id in (select id from table where age > 20 limit 1000000,10).这样虽然也load了一百万的数据,但是由于索引覆盖,要查询的所有字段都在索引中,所以速度会很快. 同时如果ID连续的好,我们还可以select * from table where id > 1000000 limit 10,效率也是不错的,优化的可能性有许多种,但是核心思想都一样,就是减少load的数据.

(2)从需求的角度减少这种请求…主要是不做类似的需求(直接跳转到几百万页之后的具体某一页.只允许逐页查看或者按照给定的路线走,这样可预测,可缓存)以及防止ID泄漏且连续被人恶意攻击.解决超大分页,其实主要是靠缓存,可预测性的提前查到内容,缓存至redis等k-V数据库中,直接返回即可.

在阿里巴巴《Java开发手册》中,对超大分页的解决办法是类似于上面提到的第一种.

【推荐】利用延迟关联或者子查询优化超多分页场景。

说明:MySQL并不是跳过offset行,而是取offset+N行,然后返回放弃前offset行,返回N行,那当offset特别大的时候,效率就非常的低下,要么控制返回的总页数,要么对超过特定阈值的页数进行SQL改写。

正例:先快速定位需要获取的id段,然后再关联:

SELECT a.* FROM 表1 a, (select id from 表1 where 条件 LIMIT 100000,20 ) b where a.id=b.id

5. mysql 分页

LIMIT 子句可以被用于强制 SELECT 语句返回指定的记录数。LIMIT 接受一个或两个数字参数。参数必须是一个整数常量。如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)

mysql> SELECT * FROM table LIMIT 5,10; // 检索记录行 6-15

为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1:

mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录行 96-last.

如果只给定一个参数,它表示返回最大的记录行数目:

mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录行

换句话说,LIMIT n 等价于 LIMIT 0,n。

6. 慢查询日志

用于记录执行时间超过某个临界值的SQL日志,用于快速定位慢查询,为我们的优化做参考。

开启慢查询日志

配置项:slow_query_log

可以使用show variables like ‘slov_query_log’

查看是否开启,如果状态值为OFF,可以使用set GLOBAL slow_query_log = on来开启,它会在datadir下产生一个xxx-slow.log的文件。

设置临界时间配置项:long_query_time

查看:show VARIABLES like ‘long_query_time’,单位秒设置:set long_query_time=0.5实操时应该从长时间设置到短的时间,即将最慢的SQL优化掉查看日志,一旦SQL超过了我们设置的临界时间就会被记录到xxx-slow.log中

7. 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过?

在业务系统中,除了使用主键进行的查询,其他的我都会在测试库上测试其耗时,慢查询的统计主要由运维在做,会定期将业务中的慢查询反馈给我们。慢查询的优化首先要搞明白慢的原因是什么?是查询条件没有命中索引?是load了不需要的数据列?还是数据量太大?所以优化也是针对这三个方向来的,

(1)首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写。

(2)分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引。

(3)如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表。

8. 为什么要尽量设定一个主键?

主键是数据库确保数据行在整张表唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增长的ID列作为主键。设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全。

最后,小编分类整理了许多java进阶学习材料和BAT面试给热爱IT行业的你,如果需要资料的请转发此文章后再私聊小编回复【java】就能领取2019年java进阶学习资料和BAT面试题以及《Effective Java》(第3版)电子版书籍。也可以加群:712263501领取海量学习资料进行学习。

MySQL面试题 | 附答案解析(十六)相关推荐

  1. MySQL面试题 | 附答案解析(六)

    B树和B+树的区别 (1)在B树中,你可以将键和值存放在内部节点和叶子节点:但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值. (2)B+树的叶子节点有一条链相连,而B树的叶子节点各自独立 ...

  2. MySQL面试题 | 附答案解析(二十)

    接上篇!!! 5. MySQL的复制原理以及流程 主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做):从而使得从数据库的数据与主数 ...

  3. MySQL面试题 | 附答案解析(十九)

    数据库优化 1. 为什么要优化 (1)系统的吞吐量瓶颈往往出现在数据库的访问速度上 (2)随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 (3)数据是存放在磁盘上的,读写速度无法和 ...

  4. MySQL面试题 | 附答案解析(十八)

    接上篇!!! SQL语句优化的一些方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 n ...

  5. MySQL面试题 | 附答案解析(十五)

    SQL优化 1. 如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因? 对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划,My ...

  6. MySQL面试题 | 附答案解析(十四)

    接上篇!!! 5. 什么是子查询 (1)QL语句的查询结果做为另一条查询语句的条件或查询结果 (2)SQL语句嵌套使用,内部的SQL查询语句称为子查询. 6. 子查询的三种情况 (1)询是单行单列的情 ...

  7. MySQL面试题 | 附答案解析(十二)

    (一)存储过程与函数 什么是存储过程?有哪些优缺点? 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次.如果某次操作需要执行多次SQL,使用 ...

  8. MySQL面试题 | 附答案解析(十)

    接上篇:锁 5. MySQL中InnoDB引擎的行锁是怎么实现的? 答:InnoDB是基于索引来完成行锁例: select * from tab_with_index where id = 1 for ...

  9. MySQL面试题 | 附答案解析(五)

    创建索引时需要注意什么? (1)非空字段:应该指定列为NOT NULL,除非你想存储NULL.在mysql中,含有空值的列很难进行查询优化,因为它们使得索引.索引的统计信息以及比较运算更加复杂.你应该 ...

最新文章

  1. DataGridView合并表头实现 、二维表头的实现
  2. Matlab:成功解决Expression or statements is incorrect--possibly unbalanced (,{,[.
  3. tkmybatis 子查询_dnssearch 子域名枚举工具
  4. 盘点 GitHub 上那些沙雕项目
  5. mysql varchar json_谈谈 MySQL 的 JSON 数据类型
  6. 游戏卡牌半小时拍出8700万天价,法院紧急叫停!
  7. K-th Number
  8. maven 基本常识以及命令
  9. python用cartopy包画地图_利用Cartopy绘制带有地图投影的图形
  10. PHP云软件短信接口,Thinkphp对接华为云短信接口
  11. 让你拥有超常记忆力的小习惯
  12. Bouncy Castle Java 平台轻量级密码术包
  13. FX5U 结构体编程
  14. Win10下SQL2000 企业管理器 新建表/修改表 崩溃问题的应急
  15. 《Windows驱动开发技术详解》学习笔记
  16. 【CSS】grid和flex
  17. dc dc变换器的建模及matlab仿真,基于Matlab的AC/DC变换器的系统建模和仿真.pdf
  18. 解读平高球动作要领,平高球怎么打
  19. 百度地图批量地址解析(地址转化经纬度)
  20. PostwomanApi接口测试工具

热门文章

  1. 2021年大数据常用语言Scala(九):基础语法学习 break和continue
  2. 2021年大数据Flink(十二):流批一体API Transformation
  3. Python:阳光热线问政平台爬虫
  4. python 获取集合里面的某一个元素
  5. Android XML: unbound prefix
  6. Failed to resolve:com.android.support:appcompat-v7:报错处理
  7. FLINK源代码调试方式
  8. VisualStudio 合并代码文件
  9. 算法设计思想(3)— 迭代法
  10. eclipse设置保护色非原创