前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POSTGRESQL SQL优化 重优化轻设计对不对与优化需要掌握的知识类别

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

作者头像
AustinDatabases
发布2022-01-11 16:59:59
4560
发布2022-01-11 16:59:59
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

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

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

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

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

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 到底应该不应该用等等。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档