SQL的生命周期?

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

2.数据库进程拿到请求sql

3.解析并生成执行计划,执行

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

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

6.关掉连接,释放资源

大表数据查询,怎么优化

1.优化shema、sql语句+索引;
2.加缓存,memcached, redis;
3.主从复制,读写分离;
4.垂直拆分,根据你模块的耦合度,将一个大的系统分为多个小的系统,也就是分布式系统;
5.水平切分,针对数据量大的表,这一步最麻烦,最能考验技术水平,要选择一个合理的sharding key, 为了有好的查询效率,表结构也要改动,做一定的冗余,应用也要改,sql中尽量带sharding key,将数据定位到限定的表上去查,而不是扫描全部的表;

超大分页怎么处理?

超大的分页一般从两个方向上来解决.

● 数据库层面,这也是我们主要集中关注的(虽然收效没那么大),类似于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的数据.
从需求的角度减少这种请求…主要是不做类似的需求(直接跳转到几百万页之后的具体某一页.只允许逐页查看或者按照给定的路线走,这样可预测,可缓存)以及防止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

要尽量设定一个主键?

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

主键使用自增ID还是UUID?

推荐使用自增ID,不要使用UUID。

因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降。

总之,在数据量大一些的情况下,用自增主键性能会好一些。

关于主键是聚簇索引,如果没有主键,InnoDB会选择一个唯一键来作为聚簇索引,如果没有唯一键,会生成一个隐式的主键。

字段为什么要求定义为not null?

null值会占用更多的字节,且会在程序中造成很多与预期不符的情况。

如果要存储用户的密码散列,应该使用什么字段进行存储?

密码散列,盐,用户身份证号等固定长度的字符串应该使用char而不是varchar来存储,这样可以节省空间且提高检索效率。

优化查询过程中的数据访问

● 访问数据太多导致查询性能下降
● 确定应用程序是否在检索大量超过需要的数据,可能是太多行或列
● 确认MySQL服务器是否在分析大量不必要的数据行
● 避免犯如下SQL语句错误
①查询不需要的数据。解决办法:使用limit解决
②多表关联返回全部列。解决办法:指定列名
③总是返回全部列。解决办法:避免使用SELECT *
④重复查询相同的数据。解决办法:可以缓存数据,下次直接读取缓存
● 是否在扫描额外的记录。解决办法:
①使用explain(查看该SQL语句有没有使用上了索引,有没有做全表扫描)进行分析,如果发现查询需要扫描大量的数据,但只返回少数的行,可以通过如下技巧去优化:
②使用索引覆盖扫描,把所有的列都放到索引中,这样存储引擎不需要回表获取对应行就可以返回结果。
③改变数据库和表的结构,修改数据表范式
④重写SQL语句,让优化器可以以更优的方式执行查询。

优化关联查询

● 确定ON或者USING子句中是否有索引。
● 确保GROUP BY和ORDER BY只有一个表中的列,这样MySQL才有可能使用索引。

优化子查询

● 用关联查询替代
● 优化GROUP BY和DISTINCT
● 这两种查询据可以使用索引来优化,是最有效的优化方法
● 关联查询中,使用标识列分组的效率更高
● 如果不需要ORDER BY,进行GROUP BY时加ORDER BY NULL,MySQL不会再进行文件排序。
WITH ROLLUP超级聚合,可以挪到应用程序处理

优化LIMIT分页

● LIMIT偏移量大的时候,查询效率较低
● 可以记录上次查询的最大ID,下次查询时直接根据该ID来查询

优化UNION查询

● UNION ALL的效率高于UNION

优化WHERE子句

解题方法

对于此类考题,先说明如何定位低效SQL语句,然后根据SQL语句可能低效的原因做排查,先从索引着手,如果索引没有问题,考虑以上几个方面,数据访问的问题,长难查询句的问题还是一些特定类型优化的问题,逐一回答。

SQL语句优化的一些方法?

● 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
● 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num is null
-- 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=

● 3.应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。
● 4.应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

select id from t where num=10 or num=20
-- 可以这样查询:
select id from t where num=10 union all select id from t where num=20

● 5.in 和 not in 也要慎用,否则会导致全表扫描,如:

select id from t where num in(1,2,3)
-- 对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3

● 6.下面的查询也将导致全表扫描:select id from t where name like ‘%李%’若要提高效率,可以考虑全文检索。
● 7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:

select id from t where num=@num
-- 可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num

● 8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

select id from t where num/2=100
-- 应改为:
select id from t where num=100*2

● 9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

select id from t where substring(name,1,3)=’abc’
-- name以abc开头的id应改为:
select id from t where name like ‘abc%’

● 10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

数据库结构优化

一个好的数据库设计方案对于数据库的性能往往会起到事半功倍的效果。

需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。

将字段很多的表分解成多个表

对于字段较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表。

因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢。

增加中间表

对于需要经常联合查询的表,可以建立中间表以提高查询效率。

通过建立中间表,将需要通过联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询。

增加冗余字段

设计数据表时应尽量遵循范式理论的规约,尽可能的减少冗余字段,让数据库设计看起来精致、优雅。但是,合理的加入冗余字段可以提高查询速度。

表的规范化程度越高,表和表之间的关系越多,需要连接查询的情况也就越多,性能也就越差。

注意:

冗余字段的值在一个表中修改了,就要想办法在其他表中更新,否则就会导致数据不一致的问题。

MySQL数据库cpu飙升到500%的话他怎么处理?

当 cpu 飙升到 500%时,先用操作系统命令 top 命令观察是不是 mysqld 占用导致的,如果不是,找出占用高的进程,并进行相关处理。

如果是 mysqld 造成的, show processlist,看看里面跑的 session 情况,是不是有消耗资源的 sql 在运行。找出消耗高的 sql,看看执行计划是否准确, index 是否缺失,或者实在是数据量太大造成。

一般来说,肯定要 kill 掉这些线程(同时观察 cpu 使用率是否下降),等进行相应的调整(比如说加索引、改 sql、改内存参数)之后,再重新跑这些 SQL。

也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等

大表怎么优化?某个表有近千万数据,CRUD比较慢,如何优化?分库分表了是怎么做的?分表分库了有什么问题?有用到中间件么?他们的原理知道么?

当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:

  1. 限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。;
  2. 读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读;
  3. 缓存: 使用MySQL的缓存,另外对重量级、更新少的数据可以考虑使用应用级别的缓存;
    还有就是通过分库分表的方式进行优化,主要有垂直分表和水平分表

垂直分区:

根据数据库里面数据表的相关性进行拆分。 例如,用户表中既有用户的登录信息又有用户的基本信息,可以将用户表拆分成两个单独的表,甚至放到单独的库做分库。

简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。 如下图所示,这样来说大家应该就更容易理解了。

垂直拆分的优点: 可以使得行数据变小,在查询时减少读取的Block数,减少I/O次数。此外,垂直分区可以简化表的结构,易于维护。

垂直拆分的缺点: 主键会出现冗余,需要管理冗余列,并会引起Join操作,可以通过在应用层进行Join来解决。此外,垂直分区会让事务变得更加复杂;

垂直分表
把主键和一些列放在一个表,然后把主键和另外的列放在另一个表中

适用场景
1、如果一个表中某些列常用,另外一些列不常用
2、可以使数据行变小,一个数据页能存储更多数据,查询时减少I/O次数
缺点
有些分表的策略基于应用层的逻辑算法,一旦逻辑算法改变,整个分表逻辑都会改变,扩展性较差
对于应用层来说,逻辑算法增加开发成本
管理冗余列,查询所有数据需要join操作
水平分区:

保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。 水平拆分可以支撑非常大的数据量。

水平拆分是指数据表行的拆分,表的行数超过200万行时,就会变慢,这时可以把一张的表的数据拆成多张表来存放。举个例子:我们可以将用户信息表拆分成多个用户信息表,这样就可以避免单一表数据量过大对性能造成影响。

水品拆分可以支持非常大的数据量。需要注意的一点是:分表仅仅是解决了单一表数据过大的问题,但由于表的数据还是在同一台机器上,其实对于提升MySQL并发能力没有什么意义,所以 水平拆分最好分库

水平拆分能够 支持非常大的数据量存储应用端改造也少,但 分片事务难以解决 ,跨界点Join性能较差,逻辑复杂。

《Java工程师修炼之道》的作者推荐 尽量不要对数据进行分片因为拆分会带来逻辑、部署、运维的各种复杂度 ,一般的数据表在优化得当的情况下支撑千万以下的数据量是没有太大问题的。如果实在要分片,尽量选择客户端分片架构,这样可以减少一次和中间件的网络I/O。

水平分表:
表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询次数

适用场景
1、表中的数据本身就有独立性,例如表中分表记录各个地区的数据或者不同时期的数据,特别是有些数据常用,有些不常用。
2、需要把数据存放在多个介质上。
水平切分的缺点
1、给应用增加复杂度,通常查询时需要多个表名,查询所有数据都需UNION操作
2、在许多数据库应用中,这种复杂度会超过它带来的优点,查询时会增加读一个索引层的磁盘次数
下面补充一下数据库分片的两种常见方案:

客户端代理: 分片逻辑在应用端,封装在jar包中,通过修改或者封装JDBC层来实现。 当当网的 Sharding-JDBC 、阿里的TDDL是两种比较常用的实现。
中间件代理: 在应用和数据中间加了一个代理层。分片逻辑统一维护在中间件服务中。 我们现在谈的 Mycat 、360的Atlas、网易的DDB等等都是这种架构的实现。

MySQL的复制原理以及流程

**主从复制:**将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。

主从复制的作用

1.主数据库出现问题,可以切换到从数据库。
2.可以进行数据库层面的读写分离。
3.可以在从数据库上进行日常备份。

MySQL主从复制解决的问题

● 数据分布:随意开始或停止复制,并在不同地理位置分布数据备份
● 负载均衡:降低单个服务器的压力
● 高可用和故障切换:帮助应用程序避免单点失败
● 升级测试:可以用更高版本的MySQL作为从库

MySQL主从复制工作原理

● 在主库上把数据更高记录到二进制日志
● 从库将主库的日志复制到自己的中继日志
● 从库读取中继日志的事件,将其重放到从库数据中
基本原理流程,3个线程以及之间的关联

:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;

:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进自己的relay log中;

:sql执行线程——执行relay log中的语句;

复制过程

Binary log:主数据库的二进制日志

Relay log:从服务器的中继日志

第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中。

第二步:salve开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是binlog dump process。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中。

第三步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。

常见的SQL跟数据库优化相关推荐

  1. SQL Server数据库优化方案

    SQL Server数据库优化方案 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计 ...

  2. SQL Server 数据库优化

    设计1个应用系统似乎并不难,但是要想使系统达到最优化的性能并不是一件容易的事. 在开发工具.数据库设计.应用程序的结构.查询设计.接口选择等方面有多种选择,这取决于特定的应用需求以及开发队伍的技能.本 ...

  3. Sql与数据库优化的几条核心建议

    本文目录: 为什么要进行数据库优化 MySql数据库优化 SQL及索引优化 MySQL慢查日志分析工具 通过explain查询分析SQL的执行计划 具体慢查询优化的案例 1. 为什么要进行数据库优化 ...

  4. 三十七、Sql 补充 | 数据库优化

    @Author : By Runsen @Date:2020/5/14 在2020年一月初,也是我大三上的寒假,我开始写书,为什么呢?因为化工原理和化工热力学挂了,我需要重拾自己的自信. 对于一个大学 ...

  5. SQL SERVER数据库优化相关资料

    1.SQL SERVER全面优化 转载于:https://www.cnblogs.com/ZHUYIN/p/9212985.html

  6. sql server 数据库优化--显示执行计划

    刚开始用SQL Server的时候,我没有用显示执行计划来对查询进行分析.我曾经一直认为我递交的SQL查询都是最优的,而忽略了查询性能究竟如何,从而对"执行计划"重视不够.在我职业 ...

  7. SQL Server 数据库优化文章

    SQL Server 致程序员(容易忽略的错误) 转载于:https://www.cnblogs.com/smile-rain/p/4686331.html

  8. 一些数据库优化经验资料整理

    对于大型数据库应用中,数据的查询与检索速度就显得非常重要.一些好的数据库设计方案.SQL语句的优化.数据库服务器性能的优化等都对数据库的整体优化起着很重要的作用.下面是我从网络上收集的一些数据库优化方 ...

  9. 优化SQL Server数据库查询方法

    本文详细介绍了优化SQL Server数据库查询方法. SQL Server数据库查询速度慢的原因有很多,常见的有以下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) ...

最新文章

  1. 【机器学习】集成学习之boosting AdaBoost
  2. 在vue中安装使用vux
  3. 程序员 sql面试_非程序员SQL使用指南
  4. HandlerInterceptor拦截器的使用
  5. canvas路径剪切和判断是否在路径内
  6. 将Sphinx的日志放置到/dev/shm里需要注意的事情
  7. 什么是super?如何使用super调用超类构造函数?
  8. 菲佣WPF——3(关于INotifyPropertyChanged的使用的想法)
  9. 判断手机上是否安装某个APP(iOS)
  10. 2021年最佳开源软件榜单出炉!
  11. Axure share如何自适应手机屏幕
  12. 洛必达法则及极限问题总结
  13. 路由与交换技术(交换机中的冗余链路管理)
  14. 计算机硬件基础与计算机组装知识总结
  15. 2018 AI产业界大盘点
  16. 机械键盘无冲测试软件,全键无冲/六键无冲可切换 键盘测试_狼派 X09暗影机械键盘_键鼠评测-中关村在线...
  17. SSH项目,failed to lazily initialize a collection of role
  18. Tomcat开启APR模式并设置Tomcat为开机自启动服务
  19. Hive 数据倾斜问题定位排查及解决(实际案例)
  20. 用Python设计抢红包系统

热门文章

  1. dhcp服务器一般在哪个位置,dhcp服务器默认地址是什么
  2. yolov5 从配置环境到自己训练数据集合
  3. 2022如何下载免费版正版Xshell7和Xftp7
  4. 学习笔记(2)点云网格化
  5. ps排版html,PS冷门技!十个不为人知的PS文本排版工具
  6. stack - es - 官方文档 - 分页
  7. java POI导出excel,合并单元格边框消失
  8. Linux Redhat7 固定IP地址
  9. 暨阳学院2022年绍兴市赛校内选拔赛(题解)
  10. 对称与魔术初步(五)——刘谦经典魔术《幻境》