SQL的优化和注意事项
現(xiàn)在我們假設(shè)我們只有一臺MySQL服務器,所有的select/update/insert/delete操作都是在這上面進行的,我們同時有三臺Web服務器,通過DNS輪巡來訪問,那么我們?nèi)绾芜M行我們應用程序和SQL的優(yōu)化。
1. Where條件
在查詢中,WHERE條件也是一個比較重要的因素,盡量少并且是合理的where條件是很重要的,在寫每一個where條件的時候都要仔細考慮,盡量在多個條件的時候,把會提取盡量少數(shù)據(jù)量的條件放在前面,這樣就會減少后一個where條件的查詢時間。
有時候一些where條件會導致索引無效,當使用了Mysql函數(shù)的時候,索引將無效,比如:select * from tbl1 where left(name, 4) = 'hylr',那么這時候索引無效,還有就是使用LIKE進行搜索匹配的時候,這樣的語句索引是無效的:select * from tbl1 where name like '%xxx%',但是這樣索引是有效的:select * from tbl1 where name like 'xxx%',所以謹慎的寫你的SQL是很重要的。
2. 關(guān)聯(lián)查詢和子查詢
數(shù)據(jù)庫一個很重要的特點是關(guān)聯(lián)查詢,LEFT JOIN 和全關(guān)聯(lián),特別是多個表進行關(guān)聯(lián),因為每個關(guān)聯(lián)表查詢的時候,進行掃描的時候都是一個笛卡爾乘積的數(shù)量級,掃描數(shù)量很大,如果確實是需要進行關(guān)聯(lián)操作,請給where或者on的條件進行索引。
關(guān)聯(lián)操作也是可能交給應用去操作的,看數(shù)據(jù)量的大小,如果數(shù)據(jù)量不是非常大,比如10萬條以下,那么就可以交給程序去處理(totododo提出筆誤,特此修正),程序分別提取左右兩個表的數(shù)據(jù),然后進行循環(huán)的掃描處理,返回結(jié)果,這個過程同樣非常耗費Web服務器的資源,那么就需要取決于你愿意把壓力放在Web服務器上或者數(shù)據(jù)庫服務器上了。
子查詢是在mysql5中支持的功能,比如:select * from tbl1 where id in(select id from tbl1),那樣效率是非常非常低,要盡量避免使用子查詢,要是我,絕對不用,呵呵。
3. ?一些耗費時間和資源的操作
SQL語句中一些浪費的操作,比如 DISTINCT、COUNT、GROUP BY、各種MySQL函數(shù)。這些操作都是比較耗資源的,同樣能夠起到統(tǒng)計的作用。如果不是十分必要,盡量不要使用distinct操作,就是提取唯一值,你完全可以把這個操作交給腳本程序去執(zhí)行提取唯一值,減少MySQL的負擔。group by 操作也是,確實需要分組的話,請謹慎的操作,如果是小批量的數(shù)據(jù),可以考慮交給腳本程序去做。
至于MySQL的函數(shù),估計很多常用,比如有人喜歡把截取字符串也交給MySQL去操作,或者時間轉(zhuǎn)換操作,使用比較多的函數(shù)像 SUBSTR(), CONCAT(), DATE_FORMAT(), TO_DAYS(), MAX(), MIN(), MD5() 等等,這些操作完全可以交給腳本程序去做,減輕MySQL的負擔。
4. 合理的建立索引
索引的提升速度的一個非常重要的手段,索引在對一些經(jīng)常進行select操作,并且值比較唯一的字段是相當有效的,比如主鍵的id字段,唯一的名字name字段等等。
但是索引對于唯一值比較少的字段,比如性別gender字段,寥寥無幾的類別字段等,意義不大,因為性別是50%的幾率,索引幾乎沒有意義。對于update/delete/insert非常頻繁的表,建立索引要慎重考慮,因為這些頻繁的操作同樣對于索引的維護工作量也是很大的,最后反而得不償失,這個需要自己仔細考慮。索引同樣不是越多越好,適當?shù)乃饕龝鸬胶荜P(guān)鍵的作用,不適當?shù)乃饕?#xff0c;反而減低效率維護,增加維護索引的負擔。
5. 監(jiān)控sql執(zhí)行效率
在select語句前面使用EXPLAIN字句能夠查看當前這個select字句的執(zhí)行情況,包括使用了什么操作、返回多少幾率、對索引的使用情況如何等等,能夠有效分析SQL語句的執(zhí)行效率和合理程度。
另外使用MySQL中本身的慢查詢?nèi)罩?#xff1a;slow-log,同樣能夠記錄查詢中花費時間比較多的SQL語句,好對相應的語句進行優(yōu)化和改寫。
另外在MySQL終端下,使用show processlist命令能夠有效的查看當前MySQL在進行的線程,包括線程的狀態(tài),是否鎖表等等,可以實時的查看SQL執(zhí)行情況,同時對一些鎖表操作進行優(yōu)化。
轉(zhuǎn)載于:https://blog.51cto.com/study86/1332225
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的SQL的优化和注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.8 FSM之Moore和Mealy
- 下一篇: Visual Studio 2012中的