欢迎关注我的头条号:Wooola,10年Java软件开发及架构设计经验,专注于Java、Golang、微服务架构,致力于每天分享原创文章、快乐编码和开源技术。
作者 | 陈虹君 DBA专家 授权头条原创首发
一、SQL优化整体思路
性能优化层次
SQL响应时间分析
T=响应时间,C=开销,V=吞吐量
性能优化的目标:
- 缩短响应时间
- 减少资源开销
- 提高系统吞吐量
Sql 优化基本原则
- 减少磁盘I/O:减少数据库访问
- 减少网路传输:减少交互次数
- 减少复杂计算:减少CPU开销
- 增加资源:利用多线程并发处理
SQL调优思路
SQL语句执行过程
绑定变量
二、表设计在SQL优化中的应用
命名规范
表相关对象的命名建议项目组统一用业务名称命名,做到见名知意
1. ORACLE不区分大小写
2. MYSQL在LINUX环境下区分大小写,在Windows环境下不分区大小写
最大长度限制 表名:30 其它:18不要使用数据库保留关键字,不要使用空格以及特殊符号,特别注意不要使用数据库保留关键字,不要使用空格以及特殊符号,特别注意编写脚本时,不要带双引号
合理进行范式化设计
TIPS:并不是范式化程度越高的设计就越好,适当反范式化设计,可以达到以空间换时间的目的。
反范式化设计:增加字段-冗余列,派生列
不同表类型特点
表设计规范
表设计你应该考虑:预期的数据量,数据保留周期,数据清理策略,字段查询频率
- 选择合适的表类型
- 必须设计主键,可以不用设计外键(除非是关系非常紧密---特别是MySql)
- 字段必须设置合理的约束(例如:业务上非空的必须设置NOT NULL ,业务上唯一的必须设置UNIQUE)
- 选择合适的字段类型
- 尽量避免宽表(控制少而精,提升IO效率,缓存更多有效数据)
- 大表考虑分表,分区(针对MYSQL 甚至分库)
- 慎用触发器(尽量使用程序来实现)
正确匹配数据类型
- integer,char,varchar …… 请暂时忘了它,常用的记住上面几种就行
- oracle的隐式转换功能 …… 请忘掉它(当然也包括MySQL)
请别再让字符、数字、时间混用了
- 不允许用字符类型存放时间或日期类数据。
- 不允许用字符类型存放数值类型的数据。
- 不允许表中字段数值类型直接使用INT型,应明确写明字段的取值范围,如number(8)。int 型在数据库中表示为number(38),造成存储空间浪费。
- 不允许表中长度不固定的字段字符类型直接使用CHAR、VARCHAR,应用VARCHAR2定义;
- 如无特别需要,避免使用大字段(blob,clob,long,text,image等),假设要使用可以使用SecureFiles 新一代LOB。
- 同一个字段名在一个数据库中只能代表一个意思,不同的表用于相同内容的字段应该采用同样的名称,字段类型定义。
主外键与约束设计
一般有一个设计原则,两个表有主外建关系时,外键的列上要创建索引,这样有两大好处,1.关联查询更高效
2.外键所在的表更新不容易产生死锁
Sharding 之 分库分表分区
表分区技术基本原理
分区技术的效益和目标
分区类型选择
三、索引设计加速数据检索
索引与数据检索
创建索引以进行有效率的数据查询
Ø 数据量少时,即便没有索引,全表搜索也不成问题
Ø 数据量大时,搜索性能问题(特别是全表搜索)才会产生
B+树索引结构
索引设计规范
- 合理选择单列索引与组合索引
- 应用模糊查询时严禁左模糊匹配与全模糊匹配
- 多表关联查询时确保被关联字段存在索引,且确保需要JOIN的字段数据类型一致
- 利用索引覆盖进行查询避免回表
- 分区表尽量使用本地(LOCAL)索引,有利于数据维护,是否使用( Global )索引请遵循分区索引创建基本原则
- 在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据 实际文本区分度决定索引长度即可【该规范只适用于MYSQL】
- 位图索引与函数索引应该尽量规避
- 外键必须创建索引
单列索引
创建单列索引的要素:
- 频繁出现在where条件中的列
- 用来与其它表进行连接的列
- 有高的选择性和过滤性的列(高选择性的字段:如果很少的字段拥有相同值,即有很多唯一值,则选择性很好)
- Oracle与MySql在主键字段和UNIQUE字段上会自动建立唯一索引
一般在查询数据量占总表数据量比例较小时才考虑使用索引定位数据,否则大量数据扫描还不如全表
复合索引
创建复合索引的要素:最左前缀原则、覆盖索引原则
- 适用于单独查询返回记录较多,而组合查询后返回记录较少的情况
例如where 学历=本科 以上会返回不少的记录,where 工作=厨师 同样会返回不少的记录,那么这2个条件任意一个查询做索引,都会不合适,但学历既是本科且工作又是厨师的,返回的记录就少之又少了,这时候创建复合索引就非常合适
- 组合查询的组合顺序,要考虑单独的前缀查询情况(否则单独前缀查询的索引不能生效或者只能用到跳跃索引),我们应该让选择性好的做为前导列
例如我们创建object_id,object_type的联合索引时,要看考虑是单独where object_id=xxx查询的多,还是单独where object_type=xxx查询的多
- 仅等值无范围查询时,复合索引顺序不影响查询性能(比如where col1=xxx and col2=xxx,无论COL1+COL2组合还是COL2+COL1组合 都一样的效果)
- 复合索引最佳顺序一般是将列等值查询的列置前
分区索引
- 可以将索引存储在不同的分区中
- 与分区有关的索引有三种类型:
- 局部分区索引 - 在分区表上创建的索引,在每个表分区上创建独立的索引,索引的分区范围与表一致
- 全局分区索引 - 在分区表或非分区表上创建的索引,索引单独指定分区的范围,与表的分区范围或是否分区无关
- 全局非分区索引 - 在分区表上创建的全局普通索引,索引没有被分区
▲需注意Oracle与MySQL的异同
索引失效情况分析
- 物理失效
索引真正意义上的失效,DML操作列时会报错,比如人为设置了unusable操作,或者分区表相关操作导致的索引失效,以及其它操作如 move表等
- 逻辑失效
索引本身并没有真正失效,而只是因为SQL的写法等一些原因导致索引利用不上那么哪些情况会导致索引无法使用?
索引去哪儿了
- 字段类型不匹配,发生了隐式或显示转换
- Like 与 %前置模糊查询
- 反向键索引不支持范围查询
- 索引列进行了函数转换或者表达式运算
- 不等于<>, != 操作
- 查询谓词条件是 is null
- 复合索引前置列设置错误
四、经典表连接方式应用
经典的3种表连接方式解读
表连接方式特点与优化建议
五、SQL审核与编码规范
SQL审核防范于未然
我们应该建立长效的机制,为应用的健康稳定运行保驾护航
- 通过规范与培训提高开发人员能力
- 通过SQL审核进行SQL质量控制
- 通过SQL捕获优化解决现有程序问题
书写规则
SQL开发审核规范
六、项目案例解析
SQL拆解分析,整个SQL其实就由3部分组成
纠结的写法
目前BPM系统存在的问题基本全在SQL开发审核规范覆盖范围之内
- 大量查询使用*号
- 没有使用绑定变量
- 大量查询使用全模糊搜索查询”%”
- 大量全表扫描(未创建索引or索引设计不合理)
- 分页查询框架使用错误
- 大表没有数据清理策略(采取分表OR分区OR历史数据归档)
- 部分存在主外键关系约束的表,外键没有创建索引
- 字段类型设计不合理
案例1:表设计问题 - - - 问题描述
存在问题:
- 表没有设计主键
- sendresult字段类型设计不合理
- Sendtime 字段类型设计不合理
- 表索引设计不合理
- sendresult字段类型设计不合理
- Sendtime 字段类型设计不合理
- 表索引设计不合理
如何改进:
- wf_orunid 设计主键
- sendresult字段类型应该设计为整形
- Sendtime 字段类型应该设计为时间类型
- wf_orunid 应该设计为唯一索引
- 分表或者按时间字段分区
- 业务上非空的字段应该显示设计not null 非空约束
- 注意CLOB字段
案例2:没有使用绑定变量 - - - 问题讨论
案例3:分页框架使用错误 - - - 问题讨论
解决方案
案例3:分页框架使用拓展 - - - 解决方案 续1
分页SQL语句的优化思路:避免排序,减少扫描
- 在分页的需求中存在排序的时候,如何避免,我们可以利用索引已经排序的特性,将order by 的列包含在索引中
- .利用rownnum 的COUNT STOPKEY 特性,减少扫描直至N行停止
拓展:多表关联分页如何优化
优化思路:多表关联分页语句如果存在排序,只能对其中一个表进行排序,且让参与排序的表作为嵌套循环的驱动表,并且驱动表返回数据的顺序要与排序的顺序一致,表的连接列必须创建好索引,如果有外连接,排序的字段只能是主表的字段,SQL语句中不要有distinct,group by ,union,union all,avg,max,min 操作
案例3:分页框架使用拓展 - - - 解决方案 续2
拓展:MySQL分页框架
开发常用框架:
select * from tab where tab_id=:B1 limit M,N
这是通常普通的分页写法,越往后翻(M越大)性能越差
建议分页框架:
select t1.* from tab t1,
(select priv_id from tab where tab_id=:B1 limit M,N) t2
where t1. priv_id =t2. priv_id
相关推荐
山海情深丨宁夏又有50名校(园)长赴福建跟岗实践学习自治区“双减”工作协调推进小组办公室部署做好2023年寒假期间校外培训治理工作衡南:营造健康校外培训生态,优化营商环境湖北1.7万评审专家线上培训 考试充电方式迎来大变革河南省“四优四化”草畜专项专家培训高效养猪技术 助力乡村振兴山东省做好高素质农民教育培训技能和学历“双提升”专家建言学习借鉴香港的成功经验,助推海南自贸港制度型开放关于陕西省中小学生校外培训项目分类鉴别专家组拟聘任人员的公示贵州护理职院举办“青马工程”实践教育培训活动贵阳幼高专邀请农技专家为帮扶村群众开展猕猴桃种植培训海南省法学会举办首届首席法律咨询专家工作培训班海南省热带病防治专家队赴柬开展疟疾防治技术培训及义诊活动 拓展海南省国际交流合作2023年度湖南省外国专家项目培训会举办湖南发布指导建议书优化网络培训环境 严查主体资质、严格监测发布广告、严管插入链接
相关内容
为全面贯彻落实2023年全区政法工作重点任务,进一步提升全区法院应用政法大数据智能化应用平台的能力和水平,10月20日,自治区高院针对全区政法大数据平台及规范量刑智能辅助系统的使用开展全面系统的实操培训。自治区高院党组副书记、副院长王旭军,···
贵州省生态环境厅电子政务中心举办2023年全省生态环境网络安全培训班10月12日至13日,贵州省生态环境厅电子政务中心举办了2023年全省生态环境网络安全培训班,厅直属各单位和各市(州)生态环境局信息技术负责人现场参训,各区(县)生态环境分局通过视频会议参训。本次培训班强调,贵州省生态环境厅电子政务中心作为···
提升网络建设水平 海南举办2023年电子政务网络安全专题培训新海南客户端、南海网、南国都市报5月19日消息(记者 姚皓)5月19日,海南2023年电子政务网络安全专题培训在澄迈举行,活动旨在加快推进海南省网络安全建设,加强全省党政机关单位网络安全防护水平,为海南自贸港、数字政府建设创造安全、有序、稳···
格尔木市气象局举办2023年网络安全培训班10月27日,格尔木市气象局举办网络安全知识培训班,进一步加强网络安全宣传教育,营造安全、健康、文明、和谐的网络环境。格尔木市气象局全体干部职工通过线上或线下方式参加了此次培训。培训围绕网络安全、数据安全等方面展开,解读了当前国内外网络安全···
2023年黑龙江省网络安全宣贯培训会在哈尔滨召开为贯彻落实中央网信办、公安部相关工作要求,推动党委(党组)网络安全工作责任制和关键信息基础设施安全保护制度深入落实,7月18日,由省委网信办、省公安厅联合举办的2023年黑龙江省网络安全专题培训暨《关键信息基础设施安全保护要求》国家标准宣贯···
京湾区数学建模与人工智能培训在澳门举办8月25至26日,国家人工智能推广暨京湾区数学建模与人工智能培训在澳门培正中学及康桥教育中心举行。图为部分出席者25日在澳门培正中学合影。 钟欣 摄中新网澳门8月26日电 国家人工智能推广暨京湾区数学建模与人工智能培训25日至26日在澳门培···
淘宝大学参与香港KOL培训 赋能香港青年就业创业中新社香港3月16日电 (记者 史冰筠)香港青年电商促进会16日宣布,将同阿里巴巴旗下培训平台淘宝大学联合举办淘宝主播培训班,聘请淘宝大学专业的直播导师进行授课,希望赋能学员通过电商拓宽就业、创业渠道,带动香港电商发展。香港青年电商促进会在···
调查:近半香港企业开展新科技培训 涵盖大数据等中新网6月25日电 据香港《文汇报》报道,香港的一项调查发现,46%受访企业于过去2年间,已开展和新科技有关的雇员培训,内容涵盖大数据、云端技术、物联网及人工智能等。香港人力资源管理学会公布香港培训调查报告。图片来源:香港《文汇报》/赵梦萦···
港媒:近半香港企业开展新科技培训 涵盖大数据等据香港《文汇报》报道,香港的一项调查发现,46%受访企业于过去2年间,已开展和新科技有关的雇员培训,内容涵盖大数据、云端技术、物联网及人工智能等。香港人力资源管理学会公布香港培训调查报告。图片来源:香港《文汇报》/赵梦萦 摄香港人力资源管理···
自治区司法厅举办全区司法行政系统网络安全和信息化建设工作能力提升培训班为深入学习贯彻党的二十大精神和习近平新时代中国特色社会主义思想,贯彻落实习近平总书记对网络安全和信息化工作的重要指示和全国网络安全和信息化工作会议精神,推动全区司法行政系统网络安全和信息化建设工作高质量发展,9月19日—20日自治区司法厅组···
2021年甘肃省网络安全管理员培训班在兰开班中国甘肃网12月27日讯(本网记者 李红军 任磊)今天上午,由甘肃省委网信办主办、兰州大学国家大学科技园承办的2021年甘肃省网络安全管理员培训班在兰州开班。省委网信办副主任刘宗礼出席开班仪式并作动员讲话,兰州大学网信办主任、信息科学与工程···
数据库使用方法系列培训活动之二|台湾月旦知识库线上讲座会议主题:西北政法大学【月旦知识库】教育训练会议时间:2022/01/18 15:30-17:30 (GMT+08:00) 中国标准时间 - 北京点击链接入会,或添加至会议列表:https://meeting.tencent.com/dm/···
2023年1 X大数据平台运维证书省级师资培训在河南开放大学举办7月13日上午,2023年1+X“大数据平台运维证书”省级师资培训在河南开放大学(郑州信息科技职业学院)开班,此次培训由河南省教育厅主办,郑州信息科技职业学院承办。河南开放大学(郑州信息科技职业学院)副校长李小明、培训学院院长张颖、信息工程···
【国家网络安全宣传周】福安市开展网络安全培训为进一步提升网络安全管理工作水平,增强广大干部网络安全风险防范能力,9月12日下午,福安市开展网络安全培训,福安市各乡镇(街道)、市直单位网络安全业务人员90余人参加培训。本次培训邀请了奇安信福建分区网络安全技术人员郑泽辉进行授课。现场培训···
花溪区开展教育系统网络安全培训7月4日,由花溪区委网信办指导,区教育局主办的花溪教育系统数据安全培训在溪南高中举行,全区公民办中小学、幼儿园、中职学校相关人员300余人参训。培训邀请网络工程师对数据安全文件进行解读,并通过真实案例介绍了数据安全的问题及处置方法以及数据安···
2023年广西招商引资大数据平台(二期)专题培训会在邕召开8月24日,2023年广西招商引资大数据平台(二期)专题培训会在南宁召开。培训会邀请大数据招商专家对平台新增功能及使用操作进行讲解,并介绍近年招商工作趋势和产业发展特点,分享大数据招商工作经验和典型案例。全区各市、县区、园区招商业务骨干和自···
云南粉笔:依托大数据智能分析打造公考培训新标准2023年9月2日,云南粉笔在昆明举行了盛大的省考产品发布会,吸引了来自全国各地的教育专家、媒体代表以及公考学子齐聚一堂。本次发布会上,粉笔推出最新研发的省考培训产品,将线上与线下课堂相结合,依托大数据智能分析,打造公考培训新标准。 云南粉···
2023年度室内设计1 X证书师资及考评员培训(黑龙江站)成功举办2023年8月21日-25日,为提升试点院校“室内设计职业技能等级证书”教育培训质量,积极推动2023年度证书试点工作顺利开展,由中国室内装饰协会主办、哈尔滨职业技术学院承办、黑龙江省室内装饰协会协办的“2023年度全国室内设计职业技能等级···
昆明经开区开展2023年春漫社区老年人智能手机使用暨网络安全培训活动来源:【昆明日报-掌上春城】掌上春城讯 “五社联动送服务,点亮民生微幸福”。8月17日,昆明经济技术开发区青年志愿者协会党支部在春漫社区组织开展“融入智能e时代 健康银龄新生活”老年人智能手机使用暨网络安全培训活动。本次培训活动围绕老年人日···
2023年全省“十四五”全民健康信息化与网络安全培训班举办5月11日—12日,2023年全省“十四五”全民健康信息化与网络安全培训班在张家口市举办。省卫生健康委二级巡视员范素文出席会议并讲话。培训班总结了2022年网络安全和信息化工作,安排了2023年重点工作。培训班邀请国家和省内有关专家对卫生健···