SQL的开发建议(MySQL和Oracle)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MYSQL 开发建议 关于建表 1、尽量使用INNODB存储引擎。 2、建议使用UNSIGNED存储非负数值。 3、建议使用INT UNSIGNED存储IPV4。

MYSQL 开发建议

关于建表

1、尽量使用INNODB存储引擎。

2、建议使用UNSIGNED存储非负数值。

3、建议使用INT UNSIGNED存储IPV4

4、强烈建议使用TINYINT来代替ENUM类型。

5、使用VARBINARY存储大小写敏感的变长字符串或二进制内容。

7、区分使用DATETIMETIMESTAMP。存储年使用YEAR类型。存储日期使用DATE类型。 存储时间(精确到秒)建议使用TIMESTAMP类型。

8、将大字段、访问频率低的字段拆分到单独的表中存储,分离冷热数据。

9、禁止在数据库表中存储明文密码。

10.表必须有主键,推荐使用UNSIGNED自增列作为主键。

11、表字符集使用UTF8,必要时可申请使用UTF8MB4字符集。

a)UTF8字符集存储汉字占用3个字节,存储英文字符占用一个字节。

b)UTF8统一而且通用,不会出现转码出现乱码风险。

c)如果遇到EMOJ等表情符号的存储需求,可申请使用UTF8MB4字符集。

12、采用合适的分库分表策略。例如千库十表、十库百表等。

 

关于索引

1、禁止冗余索引。

2、禁止重复索引。

3、不在低基数列上建立索引,例如“性别”。

4、合理使用覆盖索引减少IO,避免排序。

 

关于SQL

1、 不管数据库隔离级别是什么状态或者事务大小,养成COMMIT习惯,避免事务锁的长期持有。

2、 更新(update)sql语句尽量使用主键条件

3、用IN代替ORSQL语句中IN包含的值不应过多。

4、用UNION ALL代替UNIONUNION ALL不需要对结果集再进行排序。

5、尽量不使用order by rand()

6、建议使用合理的分页方式以提高分页效率。

7、SELECT只获取必要的字段,尽量少使用SELECT *

8、SQL中避免出现now()rand()sysdate()current_user()等不确定结果的函数。

9、减少与数据库交互次数,尽量采用批量SQL语句。

使用下面的语句来减少和db的交互次数:

a)INSERT ... ON DUPLICATE KEY UPDATE

b)REPLACE INTO

c)INSERT IGNORE

d)INSERT INTO VALUES()

10、拆分复杂SQL为多个小SQL,避免大事务。

11、对同一个表的多次alter操作必须合并为一次操作。

Oracle 开发建议

使用索引需要注意的地方:

1、避免在索引列上使用NOT, 

2、避免在索引列上使用计算.

低效:SELECT FROM DEPT WHERE SAL * 12 > 25000;

高效:SELECT FROM DEPT WHERE SAL > 25000/12;

3、避免在索引列上使用IS NULLIS NOT NULL

低效:(索引失效) SELECT FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;

高效:(索引有效) SELECT FROM DEPARTMENT WHERE DEPT_CODE >=0;

4、避免改变索引列的类型.

 

关于SQL

1、用EXISTS替换DISTINCT

(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D , EMP E

WHERE D.DEPT_NO = E.DEPT_NO

And E.sex =man

(高效): SELECT DEPT_NO,DEPT_NAME FROM DEPT D

WHERE EXISTS

( SELECT ‘X' FROM EMP E WHERE E.DEPT_NO = D.DEPT_NO

And E.sex =man

);

2、用(UNION)UNION ALL替换OR (适用于索引列)

高效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 UNION ALL

SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE REGION = “MELBOURNE”

低效: SELECT LOC_ID , LOC_DESC , REGION FROM LOCATION WHERE LOC_ID = 10 OR REGION = MELBOURNE

3、用UNION-ALL 替换UNION ( 如果有可能的话)

4Order By语句加在索引列,最好是主键PK上。

SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE(低效)

SELECT DEPT_CODE FROM DEPT ORDER BY DEPT_CODE (高效)

5、避免使用耗费资源的操作:

带有DISTINCT,UNION,MINUS,INTERSECTSQL语句会启动SQL引擎 执行耗费资源的排序(SORT)功能.

6、使用Where替代Having(如果可以的话)

低效:

SELECT JOB , AVG(SAL)

FROM EMP GROUP JOB HAVING JOB = ‘PRESIDENT'AND AVG(SAL)>XXX

高效:

SELECT JOB , AVG(SAL)

FROM EMP

WHERE JOB = ‘PRESIDENT'

OR JOB = ‘MANAGER' GROUP JOB Having AND AVG(SAL)>XXX

7、通常来说,如果语句能够避免子查询的使用,就尽量不用子查询。因为子查询的开销是相当昂贵的。具体的例子在后面的案例“一条SQL的优化过程”中。

8、注意WHERE子句中的连接顺序。合理选择驱动表。

9SELECT子句中避免使用 *ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
13天前
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
18天前
|
SQL 运维 关系型数据库
MySQL 运维 SQL 备忘
MySQL 运维 SQL 备忘录
43 1
|
7天前
|
SQL 关系型数据库 MySQL
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
MySql5.6版本开启慢SQL功能-本次采用永久生效方式
16 0
|
7天前
|
SQL 关系型数据库 MySQL
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
mysql编写sql脚本:要求表没有主键,但是想查询没有相同值的时候才进行插入
14 0
|
19天前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
37 0
|
20天前
|
SQL 存储 关系型数据库
mysql SQL必知语法
本文详细介绍了MySQLSQL的基本语法,包括SELECT、FROM、WHERE、GROUPBY、HAVING、ORDERBY等关键字的使用,以及数据库操作如创建、删除表,数据类型,插入、查询、过滤、排序、连接和汇总数据的方法。通过学习这些内容,读者将能更好地管理和操
10 0
|
21天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
55 3
Mysql(4)—数据库索引
|
6天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
40 2
|
9天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
41 4
|
14天前
|
存储 关系型数据库 MySQL
如何在MySQL中创建数据库?
【10月更文挑战第16天】如何在MySQL中创建数据库?

热门文章

最新文章

推荐镜像

更多