##五、SQL設計規范
1. 不使用SELECT \*,只獲取必要的字段
> 消耗CPU和IO、消耗網絡帶寬;
無法使用覆蓋索引
<code>
低效查詢
SELECT * FROM t ;
----->
高效查詢
SELECT uid,name,age,address FROM t WHERE LOC_IN IN (10,20,30);
</code>
2. 用IN來替換OR
<code>
低效查詢
SELECT uid,name,age,address FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;
----->
高效查詢
SELECT uid,name,age,address FROM t WHERE LOC_IN IN (10,20,30);
</code>
3. 避免數據類型不一致導致索引失效
<code>
錯誤寫法
SELECT uid,name,age,address FROM t WHERE id = '19';
----->
正確寫法
SELECT uid,name,age,address FROM t WHERE id = 19;
</code>
4. 減少與數據庫的交互次數
<code>
低效查詢
INSERT INTO t (id, name) VALUES(1,'Bea');
INSERT INTO t (id, name) VALUES(2,'Belle');
INSERT INTO t (id, name) VALUES(3,'Bernice');
----->
高效查詢
INSERT INTO t (id, name) VALUES(1,'Bea'), (2,'Belle'),(3,'Bernice');
Update … where id in (1,2,3,4);
Alter table tbl_name add column col1, add column col2;
</code>
5. 拒絕大SQL,拆分成小SQL
<code>
低效查詢
SELECT * FROM tag
JOIN tag_post ON tag_post.tag_id = tag.id
JOIN post ON tag_post.post_id = post.id
WHERE tag.tag = 'mysql';
可以分解成下面這些查詢來代替
----->
高效查詢
SELECT * FROM tag WHERE tag = 'mysql'
SELECT * FROM tag_post WHERE tag_id = 1234
SELECT * FROM post WHERE post_id in (123, 456, 567, 9098, 8904);
</code>
6. 禁止使用order by rand()
> 因為ORDER BY rand()會將數據從磁盤中讀取,進行排序,會消耗大量的IO和CPU
<code>
低效查詢
SELECT * FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4;
高效查詢
SELECT * FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4;
</code>
- 說明
- Python編程規范
- Python風格規范
- Python語言規范
- Java編程規范
- 一、命名約定
- 二、常量定義
- 三、格式約定
- 四、OOP約定
- 五、集合處理
- 六、并發控制
- 七、控制語句
- 八、注釋約定
- 九、異常日志
- 十、日志約定
- Android開發規范
- 前端開發規范
- HTML
- JavaScript
- CSS
- MySQL約定
- 一、基本規范
- 二、庫表設計規范
- 三、字段設計規范
- 四、索引規范
- 五、SQL設計規范
- 六、業務字段命名規范
- 開發安全約定
- 一、代碼安全
- 二、移動開發安全
- 三、服務器安全
- 四、安全意識
- 版本管理
- Git使用規范
- 技術實踐及可視化
- 一、Code Review
- 二、單元測試
- 三、自動化測試
- 四、技術債
- 五、CI
- IOS開發規范