SQL的开发建议(MySQL和Oracle)

MYSQL 开发建议

关于建表

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

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

3、建议使用INT UNSIGNED存储IPV4。

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

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

7、区分使用DATETIME和TIMESTAMP。存储年使用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代替OR。SQL语句中IN包含的值不应过多。

4、用UNION ALL代替UNION。UNION 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 NULL和IS
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 ( 如果有可能的话)。

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

SELECT
DEPT_CODE FROM DEPT ORDER BY DEPT_TYPE(低效)

SELECT
DEPT_CODE FROM DEPT ORDER BY DEPT_CODE (高效)

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

带有DISTINCT,UNION,MINUS,INTERSECT的SQL语句会启动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子句中的连接顺序。合理选择驱动表。

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

时间: 2024-09-30 11:28:16

SQL的开发建议(MySQL和Oracle)的相关文章

^全^ 获取SQL SERVER2000/2005、MySql、Oracle元数据的SQL语句 [SQL语句来自CodeSmith]

前言      前段时间老赵发了一篇关于和谐社区,和谐技术:微软的宠儿们,为什么富人的孩子就不能早当家?引发的争论至今令我诚惶诚恐,说得很在理!!这篇文章本打算放首页的,但是由于是拿来主义,我认为这属于新手的典型特征之一(本来就是新手=_=),故老老实实的放新手区吧.心里比较踏实一点,即使看到的人不多也没关系,自己做个笔记 :)      有很多朋友都比较关心代码自动生成,理所当然离不开元数据了,但是对于获取元数据的方法不一.由于最近我也在写代码生成,对元数据的获取SQL语句并不齐全,意外的想到

数据库sql语句to_char优化[mysql和oracle ]

最早发现这个问题是在买买提分析中,如果 在数据库sql语句中用  代码如下 复制代码 select * from 表名 where  to_char('表中的日期字段', 'YYYY-MM-DD') = '2011-01-11', 如果的表中的数据不多,那么执行这个语句ok没有问题, 如果表中的数据过多(1000- 3000万),那么会提示数据库内存溢出~~~~ 解决方案: ORACLE: 表中的日期字段  代码如下 复制代码 <= to_date(#map.st_date:VARCHAR# 

MySQL 第九篇:Mysql 与 ORACLE 开发差异、Mysql 优化

我把MySQL的内容整理成9篇博客,学完这9篇博客虽不能说能成为大神,但是应付一般中小企业的开发已经足够了,有疑问或建议的欢迎留言讨论. Mysql 与 ORACLE 开发差异 一. 常用的基本数据类型对比 二. 常用 SQL函数以及其它语法差异 Mysql 优化 一. 数据库设计 a) 适当的违反三大范式. b) 适当建立索引. c) 对表进行水平划分(按照一个周期对表数据进行拆分). d) 对表进行垂直划分(对字段内容较长的字段进行拆分到一个新表). e) 选择合适的字段类型.能占用字节小的

《SQL初学者指南(第2版)》——1.2 Microsoft SQL Server、MySQL和Oracle

1.2 Microsoft SQL Server.MySQL和Oracle 尽管我们的目标是介绍SQL的核心语言,因为它适用于所有的实现,但是,我也会提供SQL语法的一些具体示例.由于各个厂商的语法各异,我决定重点关注如下这3种数据库所使用的SQL语法: Microsoft SQL Server: Oracle: MySQL. 大多数情况下,这些数据库有着相同的语法.然而,偶尔也会有所不同.如果这3种数据库之间有任何的差异,本书的正文中将会采用Microsoft SQL Server的语法,我会

基于Oracle的高性能动态SQL程序开发

摘要:对动态SQL的程序开发进行了总结,并结合笔者实际开发经验给出若干开发技巧. 关键词:动态SQL,PL/SQL,高性能 1. 静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输入时,那么Oracle的SQL引擎就无法在编译期对该程序语句进行确定,只能

SQL Server的链接服务器(MySQL、Oracle、Ms_sql、Access、SYBASE)

原文:SQL Server的链接服务器(MySQL.Oracle.Ms_sql.Access.SYBASE) 一.使用 Microsoft OLE DB Provider For ODBC 链接MySQL 安装MySQL的ODBC驱动MyODBC 1.为MySQL建立一个ODBC系统数据源,例如:选择数据库为test ,数据源名称为myDSN 2.建立链接数据库 EXEC sp_addlinkedserver @server = 'MySQLTest', @srvproduct='MySQL',

基于Oracle的高性能动态SQL程序开发_oracle

正在看的ORACLE教程是:基于Oracle的高性能动态SQL程序开发. 摘要:对动态SQL的程序开发进行了总结,并结合笔者实际开发经验给出若干开发技巧. 关键词:动态SQL,PL/SQL,高性能 1. 静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一种是后期联编(late binding),即SQL语句只有在运行阶段才能建立,例如当查询条件为用户输

简单对比MySQL和Oracle中的一个sql解析细节

SQL的语法解析器是一个很强大的内置工具集,里面会涉及到很多的编译原理的相关知识,语法分析,词法分析..一大堆看起来很理论的东东,不过看起来枯燥之余,它们的价值也更加明显. 借用一下网络中的原话:如果我们考究一下历史,就会发现很多被称为程序设计大师的人都是编译领域的高手.写出第一个微型机上运行的Basic语言的比尔盖茨,设计出Delphi的Borland的"世界上最厉害的程序员", Sun的JAVA之父, 贝尔实验室的C++之父 起点提得有些高了,今天和大家分享的案例是一个很简单的sq

Jsp 连接 mySQL、Oracle 数据库备忘(Windows平台)

js|mysql|oracle|window|数据|数据库  Jsp 环境目前最流行的是 Tomcat5.0.Tomcat5.0 自己包含一个 Web 服务器,如果是测试,就没必要把 Tomcat 与 IIS 或 Apache 集成起来.在 Tomcat 自带的 Web 服务器下可以进行 Jsp 测试.    安装 Tomcat5.0 前需要安装 JDK(如果是 Windows server 2003 就必须安装 JDK,因为 Windows server 2003 是不带 JVM 的-Wind