避免使用SELECT *:在查詢時,只選擇需要的列,而不是使用
SELECT *
。這樣可以減少不必要的資料查詢和傳輸。SELECT name, age FROM user WHERE id = 1;
使用UNION ALL代替UNION:使用
UNION ALL
來獲取所有資料,包括重複的,以避免UNION
的排重操作,從而減少CPU資源消耗。(SELECT * FROM user WHERE id = 1) UNION ALL (SELECT * FROM user WHERE id = 2);
小表驅動大表:使用小表的資料集來驅動大表的資料集,例如使用
IN
或EXISTS
。根據實際情況選擇適合的關鍵字。SELECT * FROM order WHERE user_id IN (SELECT id FROM user WHERE status = 1);
批次操作:批次插入或更新資料,以減少資料庫請求次數,提升效能。
INSERT INTO order(id, code, user_id) VALUES(123, '001', 100), (124, '002', 100), (125, '003', 101);
多用LIMIT:使用
LIMIT
來限制查詢結果的數量,提高查詢效率。同時,在刪除或修改操作中使用LIMIT
以避免誤操作。SELECT id, create_date FROM order WHERE user_id = 123 ORDER BY create_date ASC LIMIT 1;
限制IN子句中的值:對
IN
子句中的值進行限制,避免查詢大量資料導致介面超時。SELECT id, name FROM category WHERE id IN (1, 2, 3...100) LIMIT 500;
增量查詢:透過條件限制,每次只查詢部分資料,提高同步效率。
SELECT * FROM user WHERE id > #{lastId} AND create_time >= #{lastCreateTime} LIMIT 100;
高效的分頁:使用
LIMIT
進行分頁時,對於大資料量的表,使用ID範圍查詢代替偏移量分頁。SELECT id, name, age FROM user WHERE id > 1000000 LIMIT 20;
用連線查詢代替子查詢:使用連線查詢代替子查詢,減少臨時表的建立和刪除,提高查詢效率。
SELECT o.* FROM order o INNER JOIN user u ON o.user_id = u.id WHERE u.status = 1;
控制JOIN表的數量:控制
JOIN
表的數量,避免複雜的索引選擇和效能消耗。SELECT a.name, b.name, c.name FROM a INNER JOIN b ON a.id = b.a_id INNER JOIN c ON c.b_id = b.id;
注意JOIN的使用:使用
INNER JOIN
時,小表驅動大表;使用LEFT JOIN
時,注意左邊應為小表。SELECT o.id, o.code, u.name FROM order o INNER JOIN user u ON o.user_id = u.id WHERE u.status = 1;
控制索引的數量:合理控制索引數量,避免過多的索引導致效能消耗。
選擇合理的欄位型別:根據資料特點選擇合適的欄位型別,如
CHAR
和VARCHAR
,以及數字型別和字串型別的選擇。ALTER TABLE order ADD COLUMN code CHAR(20) NOT NULL;
提升GROUP BY的效率:在
GROUP BY
前使用WHERE
條件過濾資料,減少分組操作的資料量。SELECT user_id, user_name FROM order WHERE user_id <= 200 GROUP BY user_id;
索引最佳化:使用
EXPLAIN
命令檢查SQL語句是否走索引,避免索引失效,並在必要時使用FORCE INDEX
強制使用特定索引。EXPLAIN SELECT * FROM `order` WHERE code='002';