首页 > 数据库 >Sql Server 数据库优化

Sql Server 数据库优化

时间:2023-04-20 15:57:05浏览次数:50  
标签:缓存 -- 数据库 SQL Server 索引 Sql 优化

从高明到普通一共有4种优化方式:

1、架构优化:最优解,一般来说在高并发的场景下对架构层进行优化其效果最为明显,常见的优化手段有:分布式缓存,读写分离,分库分表等,每种优化手段又适用于不同的应用场景。

2、硬件优化:有钱能使鬼推磨,性能差了、反应慢了,就更新/迭代,从物理层次高纬度打击,机械硬盘升级固态,一个服务器不够就两个服务器。

3、DB优化:数据库实例参数优化遵循三句口诀:日志不能小、缓存足够大、连接要够用。

4、SQL优化:最次解,就是通过给查询字段添加索引或者改写SQL提高其执行效率

 

具体架构优化:

1、分布式缓存:更适用于高并发、大数据量大场景。

        有句老话说的好,性能不够,缓存来凑。当需要在架构层进行优化时我们第一时间就会想到缓存这个神器,在应用与数据库之间增加一个缓存服务,如Redis或Memcache。

  当接收到查询请求后,我们先查询缓存,判断缓存中是否有数据,有数据就直接返回给应用,如若没有再查询数据库,并加载到缓存中,这样就大大减少了对数据库的访问次数,自然而然也提高了数据库性能。

  不过需要注意的是,引入分布式缓存后系统需要考虑如何应对缓存穿透、缓存击穿和缓存雪崩的问题。

 

2、读写分离:用于解决 “数据库读性能问题”。

   一主多从,读写分离,主动同步,是一种常见的数据库架构优化手段。

        一般来说当你的应用是读多写少,数据库扛不住读压力的时候,采用读写分离,通过增加从库数量可以线性提升系统读性能。

  主库,提供数据库写服务;从库,提供数据库读能力;主从之间,通过binlog同步数据。

        当准备实施读写分离时,为了保证高可用,需要实现故障的自动转移,主从架构会有潜在主从不一致性问题。

 

3、水平切分:用于解决“数据库数据量大的问题”。

        水平切分,也是一种常见的数据库架构优化手段。

        当你的应用业务数据量很大,单库容量成为性能瓶颈后,采用水平切分,可以降低数据库单库容量,提升数据库写性能。

   当准备实施水平切分时,需要结合实际业务选取合理的分片键(sharding-key)。

 

4、SQL 优化套路:

  一、查看执行计划 explain sql

  二、如果有告警信息,查看告警信息 show warnings;

  三、查看SQL涉及的表结构和索引信息

  四、根据执行计划,思考可能的优化点

  五、按照可能的优化点执行表结构变更、增加索引、SQL改写等操作

  六、查看优化后的执行时间和执行计划

  七、如果优化效果不明显,重复第四步操作

 

5、SQL 优化通用技巧:

  --> 合理使用索引

 

  索引少了查询慢;索引多了占用空间大,执行增删改语句的时候需要动态维护索引,影响性能 选择率高(重复值少)且被where频繁引用需要建立B树索引;一般join列需要建立索引;复杂文档类型查询采用全文索引效率更好;索引的建立要在查询和DML性能之间取得平衡;复合索引创建时要注意基于非前导列查询的情况

 

 

  --> 使用UNION ALL替代UNION

 

  UNION ALL的执行效率比UNION高,因为UNION执行时需要排重;

 

 

  --> 避免select * 写法

 

  执行SQL时优化器需要将 * 转成具体的列;每次查询都要回表,不能走覆盖索引。

 

 

  -->JOIN字段建议建立索引

 

  一般JOIN字段都提前加上索引

 

 

  -->避免复杂SQL语句

 

  提升可阅读性;避免慢查询的概率;可以转换成多个短查询,用业务端处理

 

 

  -->避免where 1=1写法

 

  -->避免order by rand()类似写法

 

  RAND()导致数据列被多次扫描

 

 

  -->执行计划
  要想优化SQL必须要会看执行计划,执行计划会告诉你哪些地方效率低,哪里可以需要优化。通过explain sql 可以查看执行计划

 

 

 

本文有参考如下:
版权声明:本文为CSDN博主「瘦弱的皮卡丘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ThinPikachu/article/details/122152689

标签:缓存,--,数据库,SQL,Server,索引,Sql,优化
From: https://www.cnblogs.com/Lee597/p/17337137.html

相关文章

  • MySQL: 为什么使用 innobackupex 备份恢复搭建主从时,必须人为设置 gtid_purged 变量
    问题描述:使用innobackupex搭建主从的步骤如下:1.主库使用innobackupex备份并apply-log2.将备份文件拷贝至从库,从库清空datadir目录,并使用innobackupex进行copy-back3.从库根据备份目录中的xtrabackup_binlog_info的GTID信息来设置gtid_purged变量。4.从库changem......
  • ArcGIS API for JavaScript 4.x加载GeoServer发布的WMTS服务
    前言 以前用OpenLayers加载GeoServer我记得很简单,现在用ArcGISAPI加载捣鼓了一天没搞好,第二天早上来参考一篇文章搞好了,我这纯属记录下。背景 客户没有ArcGISServer的许可,所以就只能用GeoServer发布或者离线切片,先研究下GeoServer,后面如果心情好再研究下离线切片。......
  • 48 结束语 | 点线网面,一起构建MySQL知识网络
    时光流逝,这是专栏的最后一篇文章。回顾整个过程,如果用一个词来描述,就是“没料到”:我没料到文章这么难写,似乎每一篇文章都要用尽所学;我没料到评论这么精彩,以致于我花在评论区的时间并不比正文少;我没料到收获这么大,每一次被评论区的提问问到盲点,都会带着久违的兴奋去分析代码。......
  • 47 直播回顾 | 林晓斌:我的 MySQL 心路历程【无音频】
    在专栏上线后的11月21日,我来到极客时间做了一场直播,主题就是“我的MySQL心路历程”。今天,我特意将这个直播的回顾文章,放在了专栏下面,希望你可以从我这些年和MySQL打交道的经历中,找到对你有所帮助的点。这里,我先和你说一下,在这个直播中,我主要分享的内容:我和MySQL打交道的经历;......
  • 30 29 | 如何判断一个数据库是不是出问题了?
    我在第25和27篇文章中,和你介绍了主备切换流程。通过这些内容的讲解,你应该已经很清楚了:在一主一备的双M架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。主备切换有两种场景,一种是主动切换,一种是被动......
  • 3 02 | 日志系统:一条SQL更新语句是如何执行的?
    前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句的执行流程又是怎样的呢?之前你可能经常听DBA同事说,MySQL可以恢复到半......
  • 2 01 | 基础架构:一条SQL查询语句是如何执行的?
    你好,我是林晓斌。这是专栏的第一篇文章,我想来跟你聊聊MySQL的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有......
  • MySQL常用命令
    查询所有数据库名![image]showdatabases;(https://img2023.cnblogs.com/blog/2805463/202304/2805463-20230420144431240-201364771.png)(使用哪个数据库)use[databasename];(查询数据库下的所有表名)showtables;(查询表中数据)select*from[tablename];(查询表结构)des[tab......
  • SqlServer触发器获取变更的数据
    1、Inserted和DeletedInserted表用于存储INSERT和UPDATE语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到inserted表和触发器表中。Inserted表中的行是触发器表中新行的副本。插入操作Inserted表有数据,Deleted表无数据删除操作Inserted表无数据,De......
  • sql 分组去重(转载)
    转载来源:https://blog.csdn.net/weixin_35750483/article/details/129077221在SQL中,要对查询结果进行分组并去重,可以使用GROUPBY和DISTINCT关键字。例如,假设有一张名为orders的表,其中有两个字段:customer_id和product_id。要查询每个客户订购的不同的产品数量,可以使用......