来,教你写一手好SQL!(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 导出日志后分析,主要原因竟然是没有命中索引和没有分页处理。其实这是非常低级的错误,我不禁后背一凉,团队成员的技术水平亟待提高啊。改造这些 SQL 的过程中,总结了一些经验分享给大家,如果有错误欢迎批评指正。

MySQL 性能


①最大数据量


抛开数据量和并发数,谈性能都是耍流氓。MySQL 没有限制单表最大记录数,它取决于操作系统对文件大小的限制。

1.jpg

《阿里巴巴 Java 开发手册》提出单表行数超过 500 万行或者单表容量超过 2GB,才推荐分库分表。


性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL 配置、数据表设计、索引优化。500 万这个值仅供参考,并非铁律。


我曾经操作过超过 4 亿行数据的单表,分页查询最新的 20 条记录耗时 0.6 秒,SQL 语句大致是:


select field_1,field_2 from table where id < #{prePageMinId} order by id desc limit 20


prePageMinId 是上一页数据记录的最小 ID。虽然当时查询速度还凑合,随着数据不断增长,有朝一日必定不堪重负。


分库分表是个周期长而风险高的大活儿,应该尽可能在当前结构上优化,比如升级硬件、迁移历史数据等等,实在没辙了再分。对分库分表感兴趣的同学可以阅读分库分表的基本思想。


②最大并发数


并发数是指同一时刻数据库能处理多少个请求,由 max_connections 和 max_user_connections 决定。


max_connections 是指 MySQL 实例的最大连接数,上限值是 16384,max_user_connections 是指每个数据库用户的最大连接数。

MySQL 会为每个连接提供缓冲区,意味着消耗更多的内存。如果连接数设置太高硬件吃不消,太低又不能充分利用硬件。

一般要求两者比值超过 10%,计算方法如下:


max_used_connections / max_connections * 100% = 3/100 *100% ≈ 3%


查看最大连接数与响应最大连接数:


show variables like '%max_connections%';
show variables like '%max_user_connections%';


在配置文件 my.cnf 中修改最大连接数:


[mysqld]
max_connections = 100
max_used_connections = 20


③查询耗时 0.5 秒


建议将单次查询耗时控制在 0.5 秒以内,0.5 秒是个经验值,源于用户体验的 3 秒原则。如果用户的操作 3 秒内没有响应,将会厌烦甚至退出。


响应时间=客户端 UI 渲染耗时+网络请求耗时+应用程序处理耗时+查询数据库耗时,0.5 秒就是留给数据库 1/6 的处理时间。


④实施原则


相比 NoSQL 数据库,MySQL 是个娇气脆弱的家伙。它就像体育课上的女同学,一点纠纷就和同学闹别扭(扩容难),跑两步就气喘吁吁(容量小并发低),常常身体不适要请假(SQL 约束太多)。


如今大家都会搞点分布式,应用程序扩容比数据库要容易得多,所以实施原则是数据库少干活,应用程序多干活:


  • 充分利用但不滥用索引,须知索引也消耗磁盘和 CPU。
  • 不推荐使用数据库函数格式化数据,交给应用程序处理。
  • 不推荐使用外键约束,用应用程序保证数据准确性。
  • 写多读少的场景,不推荐使用唯一索引,用应用程序保证唯一性。
  • 适当冗余字段,尝试创建中间表,用应用程序计算中间结果,用空间换时间。
  • 不允许执行极度耗时的事务,配合应用程序拆分成更小的事务。
  • 预估重要数据表(比如订单表)的负载和数据增长态势,提前优化。


数据表设计


①数据类型


数据类型的选择原则,更简单或者占用空间更小:


  • 如果长度能够满足,整型尽量使用 tinyint、smallint、medium_int 而非 int。
  • 如果字符串长度确定,采用 char 类型。
  • 如果 varchar 能够满足,不采用 text 类型。
  • 精度要求较高的使用 decimal 类型,也可以使用 BIGINT,比如精确两位小数就乘以 100 后保存。
  • 尽量采用 timestamp 而非 datetime。

2.jpg

相比 datetime,timestamp 占用更少的空间,以 UTC 的格式储存自动转换时区。


②避免空值


MySQL 中字段为 NULL 时依然占用空间,会使索引、索引统计更加复杂。从 NULL 值更新到非 NULL 无法做到原地更新,容易发生索引分裂影响性能。


因此尽可能将 NULL 值用有意义的值代替,也能避免 SQL 语句里面包含 is not null 的判断。

③Text 类型优化


由于 Text 字段储存大量数据,表容量会很早涨上去,影响其他字段的查询性能。建议抽取出来放在子表里,用业务主键关联。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
开发者 UED
深入理解 Nuxt.js 中的 app:error 钩子
【9月更文挑战第26天】在 Nuxt.js 中,钩子函数是在特定生命周期阶段执行代码的机制,`app:error` 钩子用于处理应用中的错误,包括服务器端和客户端渲染时出现的问题。它提供了一个集中处理错误的机制,提升了用户体验。当组件渲染过程中出现错误时,`app:error` 钩子会被触发,可以在 `nuxt.config.js` 文件中定义该钩子。通过分析错误对象 `err` 和上下文信息 `context`,开发者可以更好地处理各种错误情况。相比组件内的 `try/catch` 或浏览器原生错误处理,`app:error` 提供了更全局和有针对性的错误处理方式。
183 6
|
敏捷开发 测试技术 持续交付
深入白盒测试:提升软件质量与测试效率的关键策略
【4月更文挑战第3天】 在软件开发的复杂多变环境中,保证产品的质量和性能是至关重要的。白盒测试作为一种重要的软件测试方法,它通过深入检查程序的内部结构、设计和编码来确保软件按照预定要求运行。本文将探讨白盒测试的核心概念、技术及其在提升软件测试效率和质量中的应用。我们将讨论如何利用白盒测试进行有效的单元测试、集成测试和系统测试,以及如何借助现代工具和技术优化测试过程。文章还将涉及白盒测试在连续集成和敏捷开发实践中的应用,为读者提供一套全面的白盒测试策略和最佳实践。
|
Windows
IntelliJ IDEA - 快速定位代码行
IntelliJ IDEA - 快速定位代码行
1296 0
|
前端开发
CSS高级常用应用技巧汇总
CSS高级常用应用技巧汇总
197 0
CSS高级常用应用技巧汇总
|
设计模式 安全 前端开发
黑客马拉松,硅谷上海国际同步PK
电影《社交网络》里的一幕让人印象深刻。马克·扎克伯格在哈佛的一间宿舍里举行了一场编程比赛,赢家成为公司里的第一位实习生。其实,每隔一段时间,Facebook便举办“黑客马拉松”比赛,让员工在一夜之间想出好的点子,并完成项目开发。
307 0
黑客马拉松,硅谷上海国际同步PK
|
缓存 前端开发 Java
SpringBoot配置属性一
mvc spring.mvc.async.request-timeout 设定async请求的超时时间,以毫秒为单位,如果没有设置的话,以具体实现的超时时间为准,比如tomcat的servlet3的话是10秒.
1707 0
|
传感器 算法
泰德兰电子:传感器3种常用算法处理,请收藏!(含代码)
在传感器使用中,我们常常需要对传感器数据进行各种整理,让应用获得更好的效果,以下介绍几种常用的简单处理方法:1.加权平滑:平滑和均衡传感器数据,减小偶然数据突变的影响;2.抽取突变:去除静态和缓慢变化的数据背景,强调瞬间变化;3.
810 0
|
算法
为什么选择合宜或中庸?
1.4 为什么选择合宜或中庸? 关于美德,柏拉图推崇圆满的正义,亚里士多德推崇中庸,斯多葛学派推崇圆满正直,亚当•斯密推崇合宜,孔子推崇中庸,这些美德都是不走极端,选择适中。
1259 0
mqc
|
Android开发
国内首份千款主流安卓应用耗电指标评测报告新鲜出炉!
近日,华为终端实开放验室通过应用后台高耗电行为检测,分类对比,发布了国内首份千款主流安卓应用耗电指标评测报告,该报告深度剖析应用高耗电背后的原因,为广大应用开发者理解低功耗应用设计提供建议。
mqc
2140 0
|
3天前
|
云安全 人工智能 自然语言处理
AI说的每一句话,都靠谱吗?
阿里云提供AI全栈安全能力,其中针对AI输入与输出环节的安全合规挑战,我们构建了“开箱即用”与“按需增强”相结合的多层次、可配置的内容安全机制。