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在解析的過程中, 會將'*' 依次轉換成所有的列名, 這個工作是透過查詢資料字典完成的, 這意味著將耗費更多的時間 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29320885/viewspace-1833947/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [Oracle]Oracle良性SQL建議OracleSQL
- SQL開發--經典建議(轉)SQL
- MySQL的最佳化建議和策略MySql
- golang開發:go併發的建議Golang
- ORACLE SQL 效能優化的一些建議OracleSQL優化
- mysql優化 | 儲存引擎,建表,索引,sql的優化建議MySql優化儲存引擎索引
- SharePoint 2013 開發——APP開發的考慮和建議APP
- oracle優化sql語句的一些建議Oracle優化SQL
- SQL稽核 | 這裡有 MySQL/Oracle 最常用的 SQL 開發規則MySqlOracle
- 給iOS開發者的Android開發建議iOSAndroid
- 10個加速Table Views開發的建議View
- Android開發一點小技巧和建議獻上Android
- mpvue開發音訊類小程式踩坑和建議Vue音訊
- MySQL常用工具選擇和建議MySql
- MySql/Oracle和SQL Server的分頁查MySqlOracleServer
- Oracle和MySQL中短小精悍的SQLOracleMySql
- Mysql優化建議MySql優化
- [需求建議]前臺個人中心外掛開發需求建議。
- 極大提高Web開發效率的8個工具和建議(含教程)Web
- 關於學習資料庫開發的一點建議和忠告資料庫
- 高效開發Android App的10個建議AndroidAPP
- 開發維護大型 Java 專案的建議Java
- 給新手學習MySQL的建議MySql
- 優化MySQL的21個建議優化MySql
- 開發維護大型專案的Java的建議Java
- 自學PHP開發路線與建議PHP
- 分析SQL給出索引優化建議的工具(美團開源)SQL索引優化
- 新手錦囊:Web前端開發小白的學習建議和路線圖Web前端
- 給JAVA設計開發新手的一些建議和意見(4)Java
- 給JAVA設計開發新手的一些建議和意見(3)Java
- 給JAVA設計開發新手的一些建議和意見(2)Java
- 給JAVA設計開發新手的一些建議和意見(1)Java
- [需求建議]分類單頁的一點建議 這算是實現快速開發吧
- iOS開發建議和技巧:第一部分iOS
- 日常開發中,提升技術的13個建議
- 給獨立開發商的5條PR建議
- 分享:高效開發Android App的10個建議AndroidAPP
- 給開發維護大型專案開發者的建議