面试必问之SQL调优与设计规范

简介: 以上文章讲述的是【线上系统打日志你了解多少】接下来我总结一下【SQL调优与设计规范】。

一、SQL调优


优化select*

1.尽量避免使用select *,返回无用的字段会降低查询效率。如下:

SELECT * FROM Student

优化方式:使用具体的字段代替*,只返回使用到的字段。

2.明知查询一条数据集,后面一定要加上limit 1

SELECT * FROM Student where username=root and password=123456 limit 1

优化in和not in

尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描。如下:

SELECT * FROM t WHERE id IN (2,3)
SELECT * FROM t1 WHERE username IN (SELECT username FROM t2)

优化方式:如果是连续数值,可以用between代替。如下:

SELECT * FROM t WHERE id BETWEEN 2 AND 3

如果是子查询,可以用exists代替。如下:

SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t1.username = t2.username)0

优化or

尽量避免使用or,会导致数据库引擎放弃索引进行全表扫描

SELECT * FROM t WHERE id = 1 OR id = 3

优化方式:可以用union代替or。如下:

SELECT * FROM t WHERE id = 1
UNION
SELECT * FROM t WHERE id = 3

tip:如果or两边的字段是同一个,如例子中这样。貌似两种方式效率差不多,即使union扫描的是索引,or扫描的是全表

优化运算符

运算能用 = 就不要用 <> ,增加索引使用几率。

SELECT * FROM t WHERE id = 1
SELECT * FROM t WHERE id <> 1

优化insert,update,delete

将大的语句处理分解成小的处理语句

优化where

where后面的列尽量被索引,这样查询效率是非常高的

SELECT * FROM t WHERE id = 1

优化group by

group by后面的列有索引,索引可以消除排序带来的CPU开销,如果是前缀索引,是不能消除排序的。

优化order by

order by后面的列有索引,索引可以消除排序带来的CPU开销,如果是前缀索引,是不能消除排序的。

排序字段顺序,asc/desc升降要跟索引保持一致,充分利用索引的有序性来消除排序带来的CPU开销。

优化limit

对于limit m, n分页查询,越往后面翻页即m越大的情况下SQL的耗时会越来越长,对于这种应该先取出主键id,然后通过主键id跟原表进行Join关联查询。


二、设计规范


UDF用户自定义函数

SQL语句的select后面使用了自定义函数UDF,SQL返回多少行,那么UDF函数就会被调用多少次,这是非常影响性能的

-- getSum是用户自定义函数 根据getSum求成本的总和
select id, payment_id, cos_sn, getSum(cost) from tsransaction where status = 1 and create_time between '2021-01-01 10:00:00' and '2021-01-12 12:00:00';

AUTO_INCREMENT 自增

建表的时候主键id带有AUTO_INCREMENT属性,而且AUTO_INCREMENT=1,在InnoDB内部是通过一个系统全局变量dict_sys.row_id来计数,row_id是一个8字节的bigint unsigned,InnoDB在设计时只给row_id保留了6个字节的长度,这样row_id取值范围就是0到2^48 - 1,如果id的值达到了最大值,下一个值就从0开始继续循环递增,在代码中禁止指定主键id值插入。

NOT NULL不等于空

根据业务含义,尽量将字段都添加上NOT NULL DEFAULT VALUE属性,如果列值存储了大量的NULL,会影响索引的稳定性

DEFAULT默认值

在创建表的时候,建议每个字段尽量都有默认值,禁止DEFAULT NULL

TEXT/BLOB 少用

创建表时如果有图片什么的请采用本地存储(对象存储OSS),当前的路径存在数据库字段中,杜绝直接存图片的二进制数据,如果真有特定的需求请分离出去单独一个表存储。而且操作那个表的时候不要用select*

text类型也是一样的是一个大类型少用,能采用其他方案就其他方案!


相关文章
|
2月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
74 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
2月前
|
SQL 存储 弹性计算
GaussDB SQL调优:建立合适的索引
GaussDB SQL调优:建立合适的索引
13 0
|
3月前
|
存储 关系型数据库 MySQL
2024年Java秋招面试必看的 | MySQL调优面试题
随着系统用户量的不断增加,MySQL 索引的重要性不言而喻,对于后端工程师,只有在了解索引及其优化的规则,并应用于实际工作中后,才能不断的提升系统性能,开发出高性能、高并发和高可用的系统。 今天小编首先会跟大家分享一下MySQL 索引中的各种概念,然后介绍优化索引的若干条规则,最后利用这些规则,针对面试中常考的知识点,做详细的实例分析。
261 0
2024年Java秋招面试必看的 | MySQL调优面试题
|
3月前
|
SQL 存储 数据库
面试题19: 如何优化SQL查询?
面试题19: 如何优化SQL查询?
面试题19: 如何优化SQL查询?
|
2月前
|
存储 关系型数据库 MySQL
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
最全MySQL面试60题(含答案):存储引擎+数据库锁+索引+SQL优化等
220 0
|
23天前
|
SQL XML 前端开发
sql 性能优化基于explain调优(二)
sql 性能优化基于explain调优(二)
27 0
|
23天前
|
SQL 前端开发 索引
sql 性能优化基于explain调优
sql 性能优化基于explain调优
20 0
|
1月前
|
SQL 关系型数据库 MySQL
SQL常见面试题总结2
SQL常见面试题总结
62 2
|
2月前
|
SQL 关系型数据库 MySQL
MySQL SQL语句面试准备
MySQL SQL语句面试准备
14 0
|
3月前
|
缓存 NoSQL Linux
面试必备:一线大厂Redis设计规范与性能优化
本文梳理了在使用Redis过程需要遵循的一些最佳实践,包括针对架构维度的一些深入性能优化的知识,如果面试官问你:"说下在使用Redis的过程中,需要注意哪些规范?",如果你按照本文的思路回答,肯定能让面试官眼前一亮,offer自然就到手了。
57 0
面试必备:一线大厂Redis设计规范与性能优化

热门文章

最新文章