設計查詢的時候乙個需要考慮的重要問題是,是否需要將乙個複雜的查詢分成許多簡單的查詢。mysql內部每秒能夠掃瞄記憶體中上百萬行資料,相比之下,mysql響應資料給客戶端就慢的多了。所以,有時候將乙個大的查詢分解為多個小查詢是有必要的。
4.3.1 切分查詢
乙個大查詢如果一次性執行的話,可能一次鎖住很多資料、佔滿整個事務日誌、耗盡系統資源、阻塞很多小的但重要的查詢。
例如,將乙個大的delete語句切分成多較小的查詢可以盡可能小的影響mysql效能,同時還可以減少mysql複製的延遲。
例如我們需要每個月執行一次下面的查詢:
delete from messages where create < date_sub(now(), interval 3 month);
那麼可以用類似下面的辦法完成同樣的工作:
rows_affected = 0dowhile rows_affected > 0
一次刪除一萬行資料一般來說是乙個比較高效而且對伺服器影響也最小的做法。同時,如果每次刪除資料後,都暫停一會再做下一次刪除,這樣也可以將伺服器上原本一次性的壓力分散到乙個很長的時間段中,就可以大大降低對伺服器的影響,還可以大大減少刪除時鎖的持有時間。
4.3.2 分解關聯查詢
很多高效能的應用都會對關聯查詢進行分解。簡單地,可以對每乙個表進行一次單錶查詢,然後將結果在應用程式中進行關聯。
例如下面這個查詢:
select *from tabjoin 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);
用分解關聯查詢的方式重構查詢有如下的優勢:
Confluence 6 重構查詢索引
查詢索引是自動維護的,但是你有時候可能會因為你在查詢的時候或檢視者郵件主題出現了異常,或者你的 confluence 例項公升級到了新的版本,你可能需要手動重構索引。進行搜尋索引重構 然後選擇general configuration鏈結。在左側面板的管理 administration 下面,選擇內...
0 重構概述
這一系列的重構知識總結自馬丁福勒的 重構 改善既有 的設計 一書。為什麼要重構?因為乙個專案往往不只乙個人在寫,其他人也會來讀寫你的 有些人甚至自己寫的 幾個月之後就看不懂當初自己寫的是什麼了。重構的目的 改進軟體的設計,使軟體更易理解,容易找出bug,在後期要新增新功能時,提高程式設計速度,重構後...
NO1重構感想
經過了長達乙個月的編碼,終於完成了no1的重構開發,雖然還有一些隱含的邏輯上的一些問題。經過這次開發,讓我感觸頗多。首先,我們一定要善於學習。大家都知道學習的好處,但是在實踐中都得到這個結論和聽別人說完全是兩碼事情。舉個例子,假如說,我想要獲得乙個標籤的innerhtml屬性,以前我都是這麼寫的。a...