MySql数据库SQL编写规范注意事项

MySQL数据库SQL编写规范对于提高代码可读性、增强代码维护性、优化查询性能、减少错误发生、促进标准化和团队协作以及提升开发效率等方面都具有重要意义。因此,在开发过程中应严格遵守SQL编写规范,以确保代码的质量和效率。

以下是 MySQL 数据库 SQL 编写的核心规范和最佳实践,涵盖可读性、性能、安全性和可维护性等方面:


一、命名规范

  1. 表名
    • 全小写,下划线分隔,明确表用途(如 user_account, order_detail)。
    • 避免保留字(如 desc, group),可通过反引号转义但不推荐。
  2. 字段名
    • 全小写,下划线分隔,避免冗余前缀(如 user_name,而非 tbl_user_name)。
  3. 索引名
    • 统一格式:idx_表名_字段(如 idx_user_email)或 uniq_表名_字段(唯一索引)。
  4. 主键
    • 建议命名为 id,类型为 BIGINT UNSIGNED AUTO_INCREMENT

二、SQL 编写规范

  1. 代码格式

    • 关键字大写(如 SELECT, WHERE),表名/字段名小写,缩进对齐:
      SELECT u.user_id, o.order_amount
      FROM user u
      INNER JOIN order o ON u.user_id = o.user_id
      WHERE u.status = 1AND o.create_time > '2023-01-01';
      
  2. 避免隐式操作

    • 显式指定字段别名(如 COUNT(*) AS total)。
    • 禁用隐式类型转换(如 WHERE id = '100',若 id 是整型应写 WHERE id = 100)。
  3. 事务控制

    • 明确事务边界,避免长事务:
      START TRANSACTION;
      -- 业务操作
      UPDATE account SET balance = balance - 100 WHERE user_id = 1;
      UPDATE account SET balance = balance + 100 WHERE user_id = 2;
      COMMIT;
      
  4. 注释

    • 复杂逻辑添加注释(如 -- 统计活跃用户,排除测试账号)。
  5. 语句结尾

    • SQL语句应以分号(;)结尾。

三、性能与安全规范

  1. 查询优化

    • 禁止 SELECT *,明确列出所需字段。
    • 分页查询使用 LIMIT,避免 OFFSET 过大(可改用游标分页)。
  2. 防 SQL 注入

    • 使用预编译(Prepared Statements)替代字符串拼接:
      -- 错误方式
      "SELECT * FROM user WHERE name = '" + name + "'";-- 正确方式(使用占位符)
      PREPARE stmt FROM 'SELECT * FROM user WHERE name = ?';
      EXECUTE stmt USING @name;
      
  3. 索引使用

    • 避免在 WHERE 子句中对索引字段进行函数操作(如 WHERE DATE(create_time) = '2023-01-01')。
    • 复合索引遵循最左前缀原则。
  4. 避免不必要的排序

    • 除非必要,否则应避免使用ORDER BY子句进行排序,以减少性能开销。
  5. 限制返回字段

    • 使用SELECT语句时,应明确指定所需的列名,而不是使用“*”替代所有列名。
  6. 避免大事务操作

    • 大事务操作可能导致系统资源的长时间占用,降低系统并发能力。因此,应尽量避免大事务操作,或在事务中尽量短的时间内完成操作并提交。

四、其他注意事项

  1. JOIN 使用
    • 优先 INNER JOIN,明确关联条件,避免笛卡尔积。
    • 替代方案:能用单表查询解决的,避免多表 JOIN。
  2. 分区表
    • 仅对超大表(如日志表)按时间或哈希分区,需评估查询是否命中分区。
  3. 避免过度使用
    • 存储过程/触发器:除非必要,优先业务层实现逻辑。
    • 视图:避免多层嵌套视图导致性能问题。
  4. 适当使用临时表和游标
  • 虽然临时表和游标在某些情况下很有用,但它们也会增加系统的开销。因此,应谨慎使用,并在可能的情况下寻找基于集的解决方案来替代它们。
  1. 避免硬编码
  • 在SQL语句中,应避免使用硬编码的值。相反,应使用变量绑定来实现SQL语句的共享和重用。
  1. 定期维护索引
  • 索引可以提高查询效率,但也会占用系统资源。因此,应定期维护索引,如重建或优化索引,以确保其始终处于最佳状态。

五、数据定义与操作

  1. DDL语句
    • 在创建或删除数据库、表等对象时,应使用正确的DDL语句。例如,使用CREATE语句创建数据库和表;使用ALTER语句修改数据库和表的结构;使用DROP语句删除数据库和表等对象。
  2. DML语句
    • 在插入、删除或修改数据时,应使用正确的DML语句。例如,使用INSERT语句插入数据;使用DELETE语句删除数据;使用UPDATE语句修改数据。

六、工具与自动化

  1. SQL 审核
    • 使用工具(如 SonarQube、美团 SQLAdvisor)检查潜在问题。
  2. 版本控制
    • 所有 SQL 变更通过迁移脚本(Migration Script)管理(如 Flyway、Liquibase)。
  3. Explain 分析
    • 对复杂查询必用 EXPLAIN 检查执行计划,关注 typekeyrows 列。

七、示例对比

错误写法
select * from user where status = 1 and createtime > 20230101;
-- 问题:SELECT *、createtime 未格式化日期、无索引优化
规范写法
SELECT user_id, username, email
FROM user
WHERE status = 1AND create_time > '2023-01-01 00:00:00'
ORDER BY user_id DESC
LIMIT 10;

八、总结

  • 核心原则:代码清晰 > 性能优化 > 灵活扩展。
  • 团队协作:通过 Code Review 和规范文档统一风格。
  • 持续优化:结合慢查询日志(slow_query_log)定期分析高频低效 SQL。

遵循以上规范可显著提升 SQL的可维护性和执行效率,降低故障风险。养成良好的SQL编写习惯可以提高开发效率。规范的代码结构使得代码更易于编写、调试和测试。开发人员可以更快地理解和修改代码,从而缩短开发周期,提高项目交付速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/14729.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

5 计算机网络

5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的,效率低的; 1.HTTP协议端口默认80,HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册,1024以后的则需…

unity碰撞的监测和监听

1.创建一个地面 2.去资源商店下载一个火焰素材 3.把procedural fire导入到自己的项目包管理器中 4.给magic fire 0 挂在碰撞组件Rigidbody , Sphere Collider 5.创建脚本test 并挂在magic fire 0 脚本代码 using System.Collections; using System.Collections.Generic; usi…

使用云效解决docker官方镜像拉取不到的问题

目录 前言原文地址测试jenkins构建结果:后续使用说明 前言 最近经常出现docker镜像进行拉取不了,流水线挂掉的问题,看到一个解决方案: 《借助阿里个人版镜像仓库云效实现全免费同步docker官方镜像到国内》 原文地址 https://developer.aliyun.com/artic…

element-plus+vue3前端如何根据name进行搜索查到符合条件的数据

界面如图&#xff0c;下面的区域是接口给的所有的&#xff0c;希望前端根据输入的内容自己去匹配。 我是使用的element-plusvue3ts的写法。 <el-input v-model"filters.region" placeholder"输入区域搜索" keyup"filterRegion(filters.region)&q…

电路研究9.3——合宙Air780EP中的AT开发指南(含TCP 示例)

根据合宙的AT研发推荐&#xff0c; AT指令基本上也简单看完了&#xff0c;这里开始转到AT的开发了。 AT 命令采用标准串口进行数据收发&#xff0c;将以前复杂的设备通讯方式转换成简单的串口编程&#xff0c; 大大简化了产品的硬件设计和软件开发成本&#xff0c;这使得几乎所…

cursor指令工具

Cursor 工具使用指南与实例 工具概览 Cursor 提供了一系列强大的工具来帮助开发者提高工作效率。本指南将通过具体实例来展示这些工具的使用方法。 1. 目录文件操作 1.1 查看目录内容 (list_dir) 使用 list_dir 命令可以查看指定目录下的文件结构: 示例: list_dir log…

AI安全最佳实践:AI应用开发安全评估矩阵(上)

生成式AI开发安全范围矩阵简介 生成式AI目前可以说是当下最热门的技术&#xff0c;吸引各大全球企业的关注&#xff0c;并在全球各行各业中带来浪潮般的编个。随时AI能力的飞跃&#xff0c;大语言模型LLM参数达到千亿级别&#xff0c;它和Transformer神经网络共同驱动了我们工…

Java继承简介

继承的本质&#xff1a;是代码的复用&#xff0c;重复使用已经定义好的方法和域&#xff08;即全局变量&#xff09; 要掌握继承首先要了解Java方法的重载和重写 方法的重载和重写 方法的重载 当前方法名相同&#xff0c;但是参数类型不同&#xff0c;发生重载 类比数学函…

【redis】缓存设计规范

本文是 Redis 键值设计的 14 个核心规范与最佳实践&#xff0c;按重要程度分层说明&#xff1a; 一、通用数据类型选择 这里我们先给出常规的选择路径图。 以下是对每个步骤的分析&#xff1a; 是否需要排序&#xff1f;&#xff1a; zset&#xff08;有序集合&#xff09;用…

Unity抖音云启动测试:如何用cmd命令行启动exe

相关资料&#xff1a;弹幕云启动&#xff08;原“玩法云启动能力”&#xff09;_直播小玩法_抖音开放平台 1&#xff0c;操作方法 在做云启动的时候&#xff0c;接完发现需要命令行模拟云环境测试启动&#xff0c;所以研究了下。 首先进入cmd命令&#xff0c;CD进入对应包的文件…

Android studio怎么创建assets目录

在Android Studio中创建assets文件夹是一个简单的步骤&#xff0c;通常用于存储不需要编译的资源文件&#xff0c;如文本文件、图片、音频等 main文件夹&#xff0c;邮件new->folder-assets folder

第26场蓝桥入门赛

5.扑克较量【算法赛】 - 蓝桥云课 C&#xff1a; #include <iostream> #include <algorithm> using namespace std;int a[100005];int main() {int n,k;cin>>n>>k;for (int i1; i<n; i)cin>>a[i], a[i] % k;sort(a1, a1n);int mx a[1]k-a…

公司配置内网穿透方法笔记

一、目的 公司内部有局域网&#xff0c;局域网上有ftp服务器&#xff0c;有windows桌面服务器&#xff1b; 在内网环境下&#xff0c;是可以访问ftp服务器以及用远程桌面登录windows桌面服务器的&#xff1b; 现在想居家办公时&#xff0c;也能访问到公司内网的ftp服务器和win…

c++:list

1.list的使用 1.1构造 1.2迭代器遍历 &#xff08;1&#xff09;迭代器是算法和容器链接起来的桥梁 容器就是链表&#xff0c;顺序表等数据结构&#xff0c;他们有各自的特点&#xff0c;所以底层结构是不同的。在不用迭代器的前提下&#xff0c;如果我们的算法要作用在容器上…

《Wiki.js知识库部署实践 + CNB Git数据同步方案解析》

一、wiki.js 知识库简介 基本概述 定义 &#xff1a;Wiki.js 是一个开源、现代、轻量且功能强大的 Wiki 应用程序&#xff0c;基于 Node.js 构建&#xff0c;旨在帮助个人和团队轻松创建、管理和共享知识。开源性质 &#xff1a;它遵循 AGPLv3 许可证&#xff0c;任何人都可以…

ip地址是手机号地址还是手机地址

在数字化生活的浪潮中&#xff0c;IP地址、手机号和手机地址这三个概念如影随形&#xff0c;它们各自承载着网络世界的独特功能&#xff0c;却又因名称和功能的相似性而时常被混淆。尤其是“IP地址”这一术语&#xff0c;经常被错误地与手机号地址或手机地址划上等号。本文旨在…

微服务 day01 注册与发现 Nacos OpenFeign

目录 1.认识微服务&#xff1a; 单体架构&#xff1a; 微服务架构&#xff1a; 2.服务注册和发现 1.注册中心&#xff1a; 2.服务注册&#xff1a; 3.服务发现&#xff1a; 发现并调用服务&#xff1a; 方法1&#xff1a; 方法2&#xff1a; 方法3:OpenFeign OpenFeig…

网络安全:挑战、技术与未来发展

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 在数字化时代&#xff0c;网络安全已成为全球关注的焦点。随着互联网的普及和信息技术的高速发展&#xff0c;网络攻击的…

PostgreSql-COALESCE函数、NULLIF函数、NVL函数使用

COALESCE函数 COALESCE函数是返回参数中的第一个非null的值&#xff0c;它要求参数中至少有一个是非null的; select coalesce(1,null,2),coalesce(null,2,1),coalesce(null,null,null); NULLIF(ex1,ex2)函数 如果ex1与ex2相等则返回Null&#xff0c;不相等返回第一个表达式的值…

neo4j-解决导入数据后出现:Database ‘xxxx‘ is unavailable. Run :sysinfo for more info.

目录 问题描述 解决方法 重新导入 问题描述 最近在linux上部署了neo4j&#xff0c;参照之前写的博客:neo4j-数据的导出和导入_neo4j数据导入导出-CSDN博客 进行了数据导出、导入操作。但是在进行导入后&#xff0c;重新登录网页版neo4j&#xff0c;发现对应的数据库状态变…