共计 2360 个字符,预计需要花费 6 分钟才能阅读完成。
本篇文章为大家展示了 SQL 的开发建议都有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
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
不管数据库隔离级别是什么状态或者事务大小,养成 COMMIT 习惯,避免事务锁的长期持有。
更新(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
4、避免改变索引列的类型.
关于 SQL
1、用 EXISTS 替换 DISTINCT:
(低效): SELECT DISTINCT DEPT_NO,DEPT_NAME FROM
DEPT D , EMP E
WHERE
D.DEPT_NO = E.DEPT_NO
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
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 在解析的过程中, 会将 * 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间
。
上述内容就是 SQL 的开发建议都有哪些,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注丸趣 TV 行业资讯频道。