在優化有問題的查詢時,目標應該是找到乙個更優的方法獲得實際需要的結果,而不是一定總是要求從mysql獲取一模一樣的結果集設計查詢的時候一定需要考慮的問題就是,是否需要將乙個複雜的查詢分成多個簡單的查詢。
雖然在傳統實現中,總是強調需要在資料庫層完成盡可能多的工作,這是因為在過去總是認為網路通訊、查詢解析和優化是一件代價很高的事情。
但是這樣的想法對於mysql並不合適,因為mysql從設計上就讓連線和斷開都很輕量,在返回乙個小查詢結果方面十分高效。
mysql內部每秒能夠掃瞄記憶體中上百萬行的資料,相比之下,mysql響應資料給客戶端的速度就慢得多。在其他條件都相同的時候,使用盡可能少的查詢當然是更好的。但是有時候,將乙個大的查詢分解為多個小查詢是很有必要的。
有時候需要對乙個大查詢分而治之,將大查詢分為數個小查詢,每個查詢功能完全相同,只完成一小部分,每次只返回一小部分查詢結果。
刪除舊的資料就是乙個很好的例子。定期清理大量資料時,如果使用乙個大的語句一次性完成的話,可能需要鎖住很多資料,占用很多資料並且會阻塞很多小的但是很重要的查詢。
將乙個大的delete語句切分成為多個較小的查詢可以盡可能小的影響mysql效能。
很多高效能的應用都會第關聯查詢進行分解。簡單地說,就是對每乙個表進行一次單錶查詢,然後將結果在應用程式中進行關聯。比如下面這個查詢:
select * from tag
join tag_post on tag_post.tag_id = tag.id
join post on tag_post.post_id = post.id
這個查詢可以分解成下面這些查詢來代替:
select * from tag where tag = 'mysql';
select * from tag_post where tag_id = 1234;
select * from post where post.id in (123,456,789);
這樣拆分的好處是:
讓快取的效率更加高效。許多應用程式可以方便地快取單錶查詢對應的結果物件
減少查詢時可能遇到的鎖競爭
在應用層做關聯,可以更容易對資料庫進行拆分,做到高效能和可拓展
查詢本身效率也可能隨之提公升。在這個例子中使用in()代替關聯查詢,可以讓mysql按照id順序進行查詢,這可能會比隨機的關聯更加高效
可以減少冗餘記錄的查詢。在應用層進行關聯查詢,意味著對於某條記錄應用只需要查詢一次,而在資料庫中進行關聯查詢,則可能需要重複的訪問一部分資料。這樣的重構有助於減少網路和記憶體的消耗。
在應用中實現了雜湊關聯,而不是使用mysql的巢狀迴圈關聯
搜商 用搜尋指令讓搜尋更加高效
80 的問題已經有答案,你要做的是搜尋 search 而不是研究 research 除了在專門的分類 上搜尋之外,最常見的搜尋問題的方法是使用搜尋引擎。用搜尋指令可以讓搜尋更加高效,更快地找到問題的答案。搜尋引擎 優點缺點 中文搜尋比較強 不用翻牆 廣告多 容易搜到無關內容 搜尋專業問題時效果差 b...
如何讓食品的包裝生產更加高效?
虹科感測器應用案例 如何讓食品的包裝生產更加高效?在食品生產的過程中,為了延長商品的保質期,我們常常會在食品的包裝中填充入不活躍的保護氣體,同時,為了檢驗食品的質量,產商還需要對包裝後的產品進行取樣檢測,一旦發現保護氣體純度不夠,出於安全起見,就必須立即對一整批的食品進行處理,這不僅造成了鋪張浪費,...
WMS系統三大亮點讓倉庫管理更加高效
近年來,wms倉庫管理系統已廣泛應用於電子行業 食品零售行業和服裝行業等不同行業。這些行業的需求者在網上不斷重新整理wms智慧型倉儲系統的新參考 這種火爆的需求態勢和廣泛的應用促使wms倉庫管理系統軟體深入到不同的領域。wms倉庫管理系統有哪些亮點?三大亮點讓您更加了解wms倉庫管理系統。近年來,w...