1、Sql优化主要优化的还是查询, 优化查询的话, 索引优化是最有效的方案。

首先要根据需求写出结构良好的SQL,然后根据SQL 在表中建立有效的索引。但是如果索引太多,不但会影响写入的效率,对查询也有一定的影响。

定位慢SQL然后并优化

这是最常用,每一个技术人员都应该掌握基本的SQL调优手段(包括方法、工具、辅助系统等)。这里以MySQL为例,最常见的方式是,由自带的慢查询日志或者开源的慢查询系统定位到具体的出问题的SQL,然后使用explain。profile等工具来逐步调优,最后经过测试达到效果后上线。

explain + sql语句查询sql执行过程, 通过执行计划,我们能得到哪些信息:

A:哪些步骤花费的成本比较高

B:哪些步骤产生的数据量多,数据量的多少用线条的粗细表示,很直观

C:每一步执行了什么动作

优化索引

(1)索引列务必重复度低, where条件字段上需要建立索引

(2)使用索引就不能用OR查询,否则索引不起作用

(3)使用索引,like模糊查询不能以%开头

(4)查询条件务必以索引列开头,否则索引失效

(5)复合索引遵守最左原则。

避免索引失效

A:尽量不要在where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

B:应尽量避免在where 子句中使用!= 或<> 操作符,否则将引擎放弃使用索引而进行全表扫描。

C:应尽量避免在where 子句中使用or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描

D:不做列运算where age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函数。计算表达式等, 都会是索引失效。

E:查询like,如果是‘%aaa’ 也会造成索引失效。

2、Sql语句调优

·根据业务场景建立覆盖索引只查询业务需要的字段,如果这些字段被索引覆盖,将极大的提高查询效率。

· 多表连接的字段上需要建立索引,这样可以极大提高表连接的效率。

· where 条件字段上需要建立索引, 但Where 条件上不要使用运算函数,以免索引失效。

· 排序字段上, 分组字段上需要建立索引。

· 优化insert 语句: 批量列插入数据要比单个列插入数据效率高。

· 优化order by 语句: 在使用order by 语句时, 不要使用select *,select 后面要查有索引的列, 如果一条sql 语句中对多个列进行排序, 在业务允许情况下, 尽量同时用升序或同时用降序。

· 优化group by 语句: 在我们对某一个字段进行分组的时候, Mysql默认就进行了排序, 但是排序并不是我们业务所需的, 额外的排序会降低效率。所以在用的时候可以禁止排序, 使用order by null禁用。

select age, count(*) from emp group by age order by null

· 尽量避免子查询, 可以将子查询优化为join 多表连接查询。

3、合理的数据库设计

根据数据库三范式来进行表结构的设计。设计表结构时,就需要考虑如何设计才能更有效的查询, 遵循数据库三范式:

i. 第一范式:数据表中每个字段都必须是不可拆分的最小单元,也就是确保每一列的原子性;

ii. 第二范式:满足一范式后,表中每一列必须有唯一性,都必须依赖于主键;

iii. 第三范式:满足二范式后,表中的每一列只与主键直接相关而不是间接相关(外键也是直接相关),字段没有冗余。

注意:没有最好的设计,只有最合适的设计,所以不要过分注重理论。三范式可以作为一个基本依据,不要生搬硬套。

有时候可以根据场景合理地反规范化:

A:分割表。

B:保留冗余字段。当两个或多个表在查询中经常需要连接时,可以在其中一个表上增加若干冗余的字段,以避免表之间的连接过于频繁,一般在冗余列的数据不经常变动的情况下使用。

C:增加派生列。派生列是由表中的其它多个列的计算所得,增加派生列可以减少统计运算,在数据汇总时可以大大缩短运算时间, 前提是这个列经常被用到, 这也就是反第三范式。

4、分表

水平分割(按行),垂直分割(按列)
分表场景

A:根据经验,MySQL 表数据一般达到百万级别,查询效率就会很低。

B:一张表的某些字段值比较大并且很少使用。可以将这些字段隔离成单独一张表,通过外键关联,例如考试成绩,我们通常关注分数,不关注考试详情。

水平分表策略

C:按时间分表:当数据有很强的实效性,例如微博的数据,可以按月分割。

按区间分表:例如用户表1 到一百万用一张表,一百万到两百万用一张表。

hash分表:通过一个原始目标id 或者是名称按照一定的hash 算法计算出数据存储的表名。

看到最后肯定是有彩蛋的!整理了一份全面的学习资料:包含完整面试题及答案(都整理成文档),

有很多干货,包含mysql,netty,spring,线程,spring cloud、JVM、源码、算法、还有详细的学习规划图,需要的朋友加v:xiaoze689 获取!

Java常见面试题:数据库优化策略有哪些?相关推荐

  1. Java常见面试题 Java面试必看 (一)

    本篇博客是本人收集网上Java相关的资料整理所得,仅供参考. 一.Java基础 1.JDK 和 JRE区别 JDK(Java Development Kit)是针对Java开发员的产品,是整个Java ...

  2. 300+ Java常见面试题总结【JavaPub版】

    点赞再看,养成习惯 答案解析见文末 我是JavaPub,专注于面试.副业,技术人的成长记录. 这份[Java常见面试题总结]我想准备很久了,前面做面试官,后来自己也面了很多一线二线互联网公司,希望通过 ...

  3. Java常见面试题 Java面试必看 (二)

    Java常见面试题 Java面试必看 (一) 十一.Spring Boot/Spring Cloud 104.什么是 spring boot? Spring Boot 是由 Pivotal 团队提供的 ...

  4. 【面试题】Java常见面试题集锦

    Java常见面试题集锦 面试题模块 这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC. ...

  5. Java常见面试题,2021年及答案汇总

    Java常见面试题,2021年及答案汇总 其实,博主还整理了,更多大厂面试题,直接下载吧 下载链接:高清172份,累计 7701 页大厂面试题 PDF 1.什么是ThreadPoolExecutor? ...

  6. Java常见面试题整理(一)

    Java常见面试题整理 字符串 抽象类与接口 集合 多线程 锁 IO流 网络编程 字符串 主要包括String.StringBuffer和StringBuilder基本概念 String相关知识 St ...

  7. Java常见面试题及答案汇总

    面临金三银四黄金跳槽季,不光是很多在职人员跃跃欲试,也有很多大学生积极地加入到应聘行列.作为技术出身的我们,找工作的一大前提就是技术是否能过关.而对于Java程序员来说,至少是两关的面试,这首个关卡就 ...

  8. 总结Java常见面试题和答案

    转载自  总结Java常见面试题和答案 int和Integer有什么区别?   答:int是java的原始数据类型,Integer是java为int提供的封装类,java为每个原始数据类型都提供了封装 ...

  9. java常见面试题及答案 1-10(基础篇)

    java常见面试题及答案 1.什么是Java虚拟机?为什么Java被称作是"平台无关的编程语言"? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程.Java 源文件被 ...

  10. JAVA常见面试题及解答

    JAVA常见面试题及解答(精华)   1)transient和volatile是java关键字吗?(瞬联) 如果用transient声明一个实例变量,当对象存储时,它的值不需要维持.例如: class ...

最新文章

  1. 用Fiddler对Android应用进行抓包
  2. lock object oracle,oracle lock 08 - 关于锁的解决方案
  3. 0402互联网新闻 | 首批进口游戏版号下放,网易腾讯获批;“少年得到”完成数千万元A轮融资...
  4. 企业大数据应用成熟度如何?大多数企业处于自嗨中
  5. 图片压缩工具optipng/jpegoptim安装
  6. 宏定义#define
  7. java cxf 工具_利用CXF工具开发WebService接口
  8. 我的网页设计(腾讯网页面制作编写)
  9. win2003(sp2 x86)+iis6+php-5.3.5-Win32 配置
  10. Android数据加密解密
  11. 2014/08/31 Zushi
  12. 程序猿的爱情--2011-12-27
  13. Java后台+微信小程序实现推送 “服务通知”
  14. Wiley Online Library的LATEX模板说明
  15. 互联网日报 | 1月30日 星期六 | 苹果单季营收首破1000亿美元;特斯拉连续六个季度盈利;全球新冠肺炎确诊病例超1亿例...
  16. 访问服务器共享文件夹慢,win8系统访问共享时复制文件速度慢的解决方法
  17. 移动开发框架--------基于腾讯手Q样式规范Frozen UI
  18. 如何设置虚拟机访问外网
  19. C语言 | 复制字符串 不用strcpy
  20. oracle表空间怎么改名字,修改oracle数据文件和表空间名字

热门文章

  1. 最近大火的「元宇宙」究竟是什么
  2. 2016版excel_一招鲜,吃遍天之四:高效办公必备工具——Excel 易用宝
  3. 纯净版Windows7系统迅雷下载路径
  4. matlab计算轮廓曲率半径,用matlab求出最小曲率半径曲线方程实例
  5. html js禁止跳转页面,js 控制页面跳转的5种方法
  6. JTAG接口简要介绍
  7. Altium Designer--多层线路的PDF文件输出
  8. 百度前员工因内网发布“女优一览表”被辞退,自诉原因:想转岗鉴黄师.........
  9. MyEclipse配置Tomcat7
  10. 杨永强“兑”现承诺 乐视云发力VaaS