sql 寫法小總

一、慢SQL消耗了70%~90%的數據庫CPU資源;

二、SQL語句獨立於程序設計邏輯,相對於對程序源代碼的優化,對SQL語句的優化在時間成本和風險上的代價都很低;
三、SQL語句能夠有不一樣的寫法;

下面是我總結的一些SQL常見的優化方法,每一個案例都簡單易懂,在開發過程當中能夠做爲參考:

一、不使用子查詢
例:SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang');
子查詢在MySQL5.5版本里,內部執行計劃器是這樣執行的:先查外表再匹配內表,而不是先查內表t2,當外表的數據很大時,查詢速度會很是慢。
在MariaDB10/MySQL5.6版本里,採用join關聯方式對其進行了優化,這條SQL會自動轉換爲
SELECT t1.* FROM t1 JOIN t2 ON t1.id = t2.id;
但請注意的是:優化只針對SELECT有效,對UPDATE/DELETE子查詢無效,固生產環境應避免使用子查詢

二、避免函數索引
例:SELECT * FROM t WHERE YEAR(d) >= 2016;
因爲MySQL不像Oracle那樣支持函數索引,即便d字段有索引,也會直接全表掃描。
應改成----->
SELECT * FROM t WHERE d >= '2016-01-01';

三、用IN來替換OR
低效查詢
SELECT * FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;
----->
高效查詢
SELECT * FROM t WHERE LOC_IN IN (10,20,30);

四、LIKE雙百分號沒法使用到索引
SELECT * FROM t WHERE name LIKE '%de%';
----->
SELECT * FROM t WHERE name LIKE 'de%';
目前只有MySQL5.7支持全文索引(支持中文)

五、讀取適當的記錄LIMIT M,N
SELECT * FROM t WHERE 1;
----->
SELECT * FROM t WHERE 1 LIMIT 10;

六、避免數據類型不一致
SELECT * FROM t WHERE id = '19';
----->
SELECT * FROM t WHERE id = 19;

七、分組統計能夠禁止排序
SELECT goods_id,count(*) FROM t GROUP BY goods_id;
默認狀況下,MySQL對全部GROUP BY col1,col2...的字段進行排序。若是查詢包括GROUP BY,想要避免排序結果的消耗,則能夠指定ORDER BY NULL禁止排序。
----->
SELECT goods_id,count(*) FROM t GROUP BY goods_id ORDER BY NULL;

八、避免隨機取記錄
SELECT * FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4;
MySQL不支持函數索引,會致使全表掃描
----->
SELECT * FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4;

九、禁止沒必要要的ORDER BY排序
SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id WHERE 1 = 1 ORDER BY u.create_time DESC;
----->
SELECT count(1) FROM user u LEFT JOIN user_info i ON u.id = i.user_id;

十、批量INSERT插入
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');數據庫

相關文章
相關標籤/搜索