Java常见面试题丨数据库优化策略有哪些?

426 阅读9分钟

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、合理的数据库设计

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

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

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

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

注意:

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

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

A:分割表。

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

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

4、分表

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

分表场景

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

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

水平分表策略

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

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

hash分表:

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

MySQL 数据库魅力所在

• 世界上最流行的开源数据库

• 使用简单

• 维护方便

• 应用场景众多(Web网站系统、日志记录系统、数据仓库系统、嵌入式系统……)

• 掌握MySQL,相当于掌握所有数据库软件的90%

关乎数据,便是差之毫厘谬以千里,数据的真实有效和精准程度直接影响着价值呈现,左右决策的制定和落地执行。

所以,大厂面试提问的细腻程度达到“令人发指”的程度便可以理解了。而有些公司还会对MySQL的掌握程度进行的阶级划分。

我们发现,大多数人并没有实操MySQL的经验,只能做到浅显了解而不能精通。如果只能单纯地进行数据库的开发和使用,自然无法跳出初级开发工程师的能力范畴;倘若能够熟练掌握技术,对业务进行数据建模,表达实体关系、索引优化,自然进阶高级开发工程师之列。

只有全面、深入、细致的掌握了MySQL,才能把握住大厂面试机会,最近又发现了新教程,给大家带来“高薪密码”:

MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括

在IT领域,SQL是当下计算机领域使用最广泛的语言之一,而MySQL就是世界上使用最广泛的数据库系统。本套MySQL8.0教程,从零到高阶全面讲解MySQL8.0,让零基础小白也能系统、全面、深入的掌握MySQL数据库,具备基本开发所需的SQL水平。

现在,大数据开发,后端开发,人工智能,数据科学,甚至是产品经理,测试,运营等相关岗位,均在使用SQL。

MySQL成为高级开发者面试中考察的必考点,也是市场需求之必然。

本套教程涵盖:MySQL基本操作、窗口函数、视图、存储过程、触发器、索引、事务、存储引擎,锁机制、日志系统、SQL优化、JDBC、pyMySQL等全部知识点!由浅入深,从SQL语言+MySQL软件全掌握。

3 大课程亮点

1. 内容全面层层递进:

本课程是目前为止,MySQL方面知识最为全面的一套课程,视频知识涵盖了MySQL的基础篇、进阶篇、运维篇这三个篇章,干货满满。在基础篇中,主要讲解MySQL的基础知识,包含MySQL安装、SQL、约束、函数、多表查询、事务等。在进阶篇中,主要讲解MySQL的存储引擎、索引、优化、存储对象、InnoDB核心、锁等相关知识。在运维篇,主要讲解了MySQL的日志、主从复制、读写分离、分库分表等方面的知识。在课程内容方面,本套课程能够完全满足我们日常的开发、运维、面试、以及自我提升的各种需求。在课程设计方面,层层递进,可以快速的帮助我们构建起完整的MySQL知识脉络,是你成为MySQL大牛的不二之选,所以这套视频必须收藏起来,相信将来会对你有很大帮助。

2. 知识讲解深入:

本套课程不仅内容全面,而且讲解深入,特别是在进阶篇、运维篇,我们讲到了MySQL的索引、优化、存储引擎及其底层结构、MVCC多版本并发控制原理等方面的知识,而在讲解的时候不仅这些知识具体是什么,怎么应用,还会讲解其底层的结构和原理,我们只有明白了底层的结构和原理之后,才能够更好的应用知识,才能够举一反三。而如果大家有了一定的MySQL基础,建议大家还是认真学习一下进阶篇、运维篇的知识,这部分的知识掌握、理解了,你的MySQL的技术水平将会到达一次新的层次,助力你早日成为MySQL大牛。

3. 原理通俗易懂:

我们学习知识,得知其然知其所以然。本课程中,特别是在进阶篇和运维篇中,涵盖了很多底层的原理,而部分原理还是比较晦涩难懂的,为了便于大家理解其原理,从而更好的吸收掌握知识,在课程中加入了大量动画及图例,来帮助大家理解、消化、吸收。

3 类适合人群

零基础:想学习的初级程序员和IT爱好者

有基础:期望MySQL有提升的IT开发者

在 职:追求高薪,想掌握MySQL高阶内容

为什么劝你一定要学MySQL?

学他!为了不在大厂面试必考点上,折戟沉沙。

学他!为了你能驰骋职场,减少不必要加班。

学他!为了高薪和给心爱的TA一个温暖的家。

成年人一定要学会抓住一切机会给自己镀金,学习是自己的事,千万别对自己说,下次一定!