POSTGRESQL SQL优化 重优化轻设计对不对与优化需要掌握的知识类别

本文探讨了SQL优化的重要性,指出不应等到出现问题才进行优化,而应在需求阶段就开始规划。以电商客户信息表设计为例,说明了根据需求选择合适表结构的必要性。文章强调理解业务并在设计阶段介入是关键,同时列举了POSTGRESQL中SQL优化应关注的方面,如查询编译、数据访问逻辑、索引策略等,并提到SQL优化是一个涉及多个因素的复杂问题。最后,提到了POSTGRESQL环境下提升数据插入性能的技巧,并预告了后续将深入讲解相关话题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

789d51beb21c5c839b287943c6dfd5b6.png

大部分公司对于SQL 的优化都是在出了问题后来优化,上了线后在去看慢查询语句。大部分业界99%是基于这样的做法,如同把眼看你喝完慢性毒药,发病后再给你调理,最终留下的一个个不解的病根。

到底SQL 优化应该从哪里开始,是应该从需求的阶段开始而不是病了在去优化,这里面第一个该介入的是开发人员,在理解需求的时候就对数据表的设计有一定的规划,而不是whatever , please let DBA do it ,have fun !

如果你是DBA 在那堆人给你审核SQL的需求时,就在给你机会纠正他们的错误,而DBA需要的是理解这个设计中的业务,在理解业务的同时来看看设计表有没有问题,我们当下DBA 的审核和 屠宰场电死猪一样 没有什么意义,只需要click  "OK" and then,猪已经死了,死在你手里了, it's done.

0f3f657caac725691ad7727f50dd4f2c.png

举例,以电商的客户信息为例,我可以将表设计成一个如下图

user_info  (表名),开发一般会设计成这样

account_id

email

first_name

last_name

home_phone

work_phone

cell_phone

也可以设计成 下面这样

user_info(表名)          

                         phone_info                

account_id        phone_id                     

email                 account_id                   

first_name         phone_type                 

last_name          phone_number           

或者下面这样

user_info(表名)          

                                    phone_info

account_id                   phone_id

email                            account_id

first_name                    home_phone

last_name                     work_phone

                                      cell_phone

到底上面的3中设计方式那个更好,看需求,对看需求

如果电话号码在需求的维度中不会作为一个单独的信息被搜索出来,而是用户提取信息时的附加品, 那设计成一张表是最好的。

而如果电话号不是一个附加品,会通过他来统计电话的类型并且经常获取电话中某一种类型,那第二种设计的方式会更好,反之用户中的电话信息都会在查询中出现,那么第三种会更好。

如需求在延伸,用户电话号码是默认的,是第一位的,是常用沟通的,可以在设置一个字段,默认或首选,用 1 0 标识的整形都表达都可以。

上面做的一切都是为了你在撰写SQL语句的时候,能最大化的避免撰写出难以优化的语句,并在同等优化下,表能够承载更多的数据。

实际上SQL的优化是一个“玄学的问题”, 一个SQL运行的速度与开发人员对业务的理解有关,与SQL 所在的数据库类型有关, 与SQL所在的数据库硬件有关,与所在数据库所调整的参数有关,还与SQL  运行的频率,以及数据库本身所承载的总的TPS QPS 有关,还与数据量有关, 这一切加载在一起,才是一个SQL 运行效率的快慢可能性的存在。

此时此刻,你还在为一个索引解决了SQL 的快慢问题而感到“高兴” OMG

回到文中的主题POSTGRESQL , 这里并不是要讲怎么从业务的角度分析你的表该怎么设计,而是在讨论如果你的数据库系统是建立与 POSTGRESQL 之上的该怎么通过 POSTGRESQL 的方式方法来承接你的表, 以及可能通过什么手段来优化这些查询,仅此而已。因为我们还需要回到实际的情况,大部分99%的企业还是要让你用最后一招来拯救已经千疮百孔的系统。

所以就必须具备第一种数据库库SQL 优化的能力,这里编写数据库查询不同于使用命令式语言编写应用程序代码。SQL是一种声明性语言,这意味着我们指定所需的结果,不指定执行路径。由于产生相同结果的两个查询可能以不同的方式执行,利用不同的资源和花费不同的时间,因此优化和“像数据库一样思考”是SQL开发的核心部分。

那么POSTGRESQL 的SQL 优化应该从那些层面开始,下面罗列了一些对于SQL 优化 DBA 需要了解和掌握的知识

1   SQL 编译与优化引擎和执行

2   数据的访问逻辑数据的存储结构

3   full scan  index scan 的不同

4   Nested loops  , hash , sort merge , 之间的不同

5   执行计划如何评判自己是对的

6   索引,复合索引,唯一索引,部分索引 ,索引与 JOIN 之间的关系

7   怎么去在查询中对索引正确选择

8   对于大SQL 如何进行写法优化,视图,物化事务到底那个更好

9   全文索引与全文查询

10  如何提升在POSTGRESQL 数据插入的性能(upsert)

后面会分别写写这些东西,同时也有同学问关于 postgresql一些语句的写法的问题,例如 upsert 到底应该不应该用等等。

af528ccc34571769cc4a76ee46b084b7.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值