关于数据库优化的一些想法(代码片段)

leo-chen-2014 leo-chen-2014     2023-01-20     797

关键词:

优化table结构

#1 列数据类型尽量使用数字类型,避免使用字符类型,后者不仅会占用较多存储空间而且会降低查询效率(逐字符比较);

#2 优先使用VARCHAR,变长字段存储空间小,还可以提升查询效率;

#3 对需要经常作为where条件出现的column添加索引,通过添加constraint设置为unique key(自动添加索引);

#4 对于单DB而言,primary key使用AUTO_INCREMENT的BIGINT是最合适的,自增类型的ID便于分页和索引(UUID的key具有无序性,而且字符类型耗费资源);对于DB集群而言,以DB自身的算法生成ID不能保证唯一性,所以需要引入一个全局的ID generator保证唯一性的同时提供较好的性能,Redis和ZooKeeper是比较好的选择;另外通过给不同的DB或者App加入一个唯一的SN也能最大程度保证唯一性。


优化SQL语句

#1 对于查询语句尽量添加NO_LOCK标志,提升DB并发量;

#2 筛选条件放置位置按优先级从高到低依次为on, where, having,越到后面需要保存的数据和进行的计算就越多:

#3 在where子句中避免使用[!=, <>, or, in, not in, %, like, is null, is not null],原因是会导致DB引擎放弃使用index而进行全文扫描,推荐使用exist或者not exist;

#4 如果某列的重复数据较多,则index不能发挥较好的性能,反而过多的索引还会降低insert和update的效率;

#5 对于涉及多张表的联合查询,依次将数据量最小的表按从右到左的顺序放置,保证中间虚拟表只包含最少的数据;

#6 DB引擎解析一条SQL语句的流程

1 [8] SELECT [9] DISTINCT [11] TOP # <column list>
2 [1]   FROM <left table> [3] <join type> JOIN <right table> [2] ON <join condition>
3 [4]   WHERE <where condition>
4 [5]   GROUP BY <group by list>
5 [6]   WITH <CUBE | ROLLUP>
6 [7]   HAVING <having condition>
7 [10]  ORDER BY <order by list>;


对于sql中每一个子句都会生成一张virtual table用于存储中间数据,因此需要尽可能的减少每一步中VT的数据,上述SQL语句的执行顺序如下:
【1-3】:FROM子句中如果只有一张表,则不做任何处理;如果有两张表,则对其做笛卡尔积处理生成VT1;然后根据join condition执行ON子句进行筛选并生成VT2;接着根据join type(LEFT, RIGHT, INNER, OUTTER)执行JOIN子句生成VT3;如果有超过两张表,则依次处理完前两张表之后在VT3的基础上继续处理之后的表,直到所有的表都处理完最终生成VT4;SQL解释器一般按照从右到左的顺序处理表,因此需要保证越是靠右的表的数据量是越少的。
【4】:根据where condition执行WHERE子句,对中间表数据进行筛选并生成VT5。
【5】:根据group by list执行GROUP子句,对中间表进行分组并生成VT6。
【6】:根据CUBE还是ROLLUP执行WITH子句,对分组结果进行汇总并生成VT7。
【7】:根据having condition执行HAVING子句,对分组结果进行筛选并生成VT8。
【8】:根据column list执行SELECT子句,对中间表进行数据映射并生成VT9。
【9】:执行DISTINCT子句,将重复的行从表中去除并生成VT10。
【10】:根据order by list执行ORDER BY子句,对中间表进行排序并生成VT11。
【11】:根据#(数量或者比例)执行TOP子句,从中间表中去除相应数据量结果并生成VT12。

定期查看SQL执行status

SQL server profiler,需要定期查看DB中超过某个执行时间限制的, 或者是资源占用率超过某些限制的SQL语句;

读写分离

对于单库DB设计而言,如果读写请求同时操作一个库,势必极大的降低DB性能;而一般情况读操作远远多于写操作,这时候就可以通过master-slave的设计,将同一个库的数据做多个备份,写操作仅针对master进行,读操作在master和salve都可以进行;master定期将自身的数据更新到slave上,保证数据的最终一致性同时提升DB的QPS。


分库分表

对于单库多表而言,业务相关的数据尽量放置于同一个库1里面(垂直切分,业务拆分),比如用户A支付B元购买了C商品寄送到D地址,这样可以保证较好的读取性能,这样也能将事务限制在一个库的范围内;但是当库1的某张表的数据记录超过某个限制(单库单表数据量在800万条以内具有比较好的读写性能),需要另起一个库2放置新增加的各个表的数据(水平切分),库1和库2具有相同的表组成,数据量增长的时候也以此类推,之后新的业务数据需要访问和操作某个库时,需要根据某种映射算法(key % n)选择对应的库进行数据读写,这个key必须是满足分布式ID的全局唯一性;

在异地多活中心的架构中,分库的设计可以解决高并发访问的问题,比如有100个手机库存,如果放到一个库里,则所有并发都需要竞争同一把锁,但如果将100个手机库存平均分配到4个库里,每个库有25个库存,则并发访问可以同时竞争四把锁,极大提升了并发效率;另外一种设计是将100个手机库存维护在一个DB库中,但使用redis等缓存基于窗口机制一次性获取多个库存到缓存中,比如redis-01预获取0-24号库存,则更新DB库存为75,redis-02预获取25-49库存,则更新DB库存为50,这样的设计可以减少较慢的DB锁的竞争,而使用较快的cache锁的竞争替代。

使用cache替代DB检索

使用redis或者memcached作为数据缓存























[转帖]关于网络编程中mtutcpudp优化配置的一些总结(代码片段)

 https://www.cnblogs.com/maowang1991/archive/2013/04/15/3022955.html感谢原作者的内容. 首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。   其中以太网(Ethernet)的数据帧在链路层  IP包在网络层  TCP或UDP... 查看详情

关于数据库优化你知道多少?(代码片段)

文章目录什么是数据库优化?优化MySQL的查询使用索引:优化子查询:优化MySQL的插入MyISAM引擎InnoDB引擎海量数据处理优化表中包含几千万条数据该怎么办?MySQL的慢查询优化慢查询概念开启慢查询日志:分析... 查看详情

hexo页面优化和音乐的心得(代码片段)

灵感  这两天在添加“留言”以及“关于”页面,准备先简单设计一下自已的页面。留言页面可以放置一些自已比较感兴趣的音乐、以及一些JS特效,再集成一个第三方的留言功能。关于页面可以放置一些简单的联... 查看详情

关于代码控制管理的一些想法

最近工作中遇到一个开发团队,对代码的版本控制管理居然没有要求,导致了种种问题。1.由于分支没有规范,最后一个小版本上线合代码居然化了几个小时,最后开发人员自己都不知道合到哪个分支。2.一些人把所有的代码都... 查看详情

ceres关于图优化问题(代码片段)

ceres关于图优化问题  首先是图的节点,一般为位姿;再者,边代表节点与节点之间的相对变换(旋转和平移),一般是真实测量的数据,如里程计、激光雷达数据、imu数据等。如下图,三角形代表位姿、边代表测量数据;虚... 查看详情

关于一些代码过程的想法

程序编写最重要的的部分应该是要学会分析问题了,要会把一段要求才分开来用流程图或者简洁明了的文字来表达出来。就像最简单的“Hello,World”,拿到这个问题你的脑袋里面想的应该直接写一个:Console.Write("Hello.World");但是如... 查看详情

mysql性能优化浅析及线上案例(代码片段)

关于数据库的性能优化其实是一个很复杂的大课题,很难通过一篇帖子讲的很全面和深刻,这也就是为什么我的标题是‘浅析’,程序员的成长一定是要付出代价和成本,因为只有真的在一线切身体会到当时的紧张和压力,对于... 查看详情

关于recyclerview优化的一些建议(代码片段)

RecyclerView几乎已经取代了ListView&GridView,但为了达到更好的性能体验,还是需要做一些适当的优化的。布局优化首当其冲,减少层次结构、减少过渡绘制,可以提高item的解析测量与绘制的效率。另外,应该... 查看详情

关于代码的一些优化(计算向量的等级)?

】关于代码的一些优化(计算向量的等级)?【英文标题】:Someoptimizationaboutthecode(computingranksofavector)?【发布时间】:2012-12-1222:32:41【问题描述】:下面的代码是一个计算向量绑定秩的函数(性能关键)://Thefunctionhereistocomputeti... 查看详情

mysql优化原理(代码片段)

如果有同学看完上一篇关于MySQL文章,文末留有两个很开放的问题,如有兴趣可以在脑袋里想想。本文也会试着回答这两个问题,希望能给你一些参考。现在可以思考一个问题,如果数据量非常大的情况下,您根据业务选择了合... 查看详情

关于监控系统的一些想法心得

...那是我开始接触监控系统的第一步,它帮助我了解了时序数据库在监控端的优秀表现。kairosdb算是相当优秀的监控系统存储后端,并且支持使用grafana(一款可视化效果极佳的数据可视化软件)作为数据展示端。同时也支持使用Tco... 查看详情

es调试与优化工作笔记(代码片段)

本文主要涉及关于elastcisearch关于内存,mapping,查询语句,系统性能查看方面基本的内容和一些调试方法的整理和收集。参考阅读官方关于index性能优化方案https://www.elastic.co/guide/en/elasticsearch/reference/current/tune-for-indexin... 查看详情

程序员收藏必看系列:深度解析mysql优化(代码片段)

...但请等等,还有一句忠告要先送给你:不要听信你看到的关于优化的“绝对真理”,包括本文所讨论的内容,而应该是在实际的业务场景下通过测试来验证你关于执行计划以及响应时间的假设。scheme设计与数据型优化选择... 查看详情

ip有效性检测及代码优化(代码片段)

...恰同时我刚好需要该函数,因此,我对该函数进行了一些优化,在此,想分享一下自己在优化该程序过程中的一些想法和思路。借此,希望能够和各位前辈进行交流。其中,原代码编写者的博客地址是:https://blo 查看详情

关于linux性能调优中网络i/o的一些笔记(代码片段)

写在前面和小伙伴分享一些Linux网络优化的笔记,内容很浅,可以用作入门博文内容结合《Linux性能优化》读书笔记整理涉及内容包括常用的优化工具(mii-tool,ethtool,ifconfig,ip,sar,iptraf,netstat)使用Demo及对应的输出解释具体的调优策... 查看详情

关于linux性能调优中网络i/o的一些笔记(代码片段)

写在前面和小伙伴分享一些Linux网络优化的笔记,内容很浅,可以用作入门博文内容结合《Linux性能优化》读书笔记整理涉及内容包括常用的优化工具(mii-tool,ethtool,ifconfig,ip,sar,iptraf,netstat)使用Demo及对应的输出解释具体的调优策... 查看详情

关于新光源束测工作的一些想法

...计软件编程系统集成基础架构的搭建(服务器,交换机、数据库、docker、EPIC 查看详情

优化if-else的想法(代码片段)

在日常代码中,总是不能避开if-else,虽然它很好,可是需要至少三行代码,真的很丑,而且业务代码里,动辄十几个if-else,实在不方便代码阅读。所以我有一个不成熟的想法,在有限的业务范围内,用Dictionary<K,V>代替。首先... 查看详情