MySQL從設計上讓連接和斷開連接都很輕量級,在返回一個小的查詢結果方面很高效。
所以運行多個小查詢現在已經不是大問題了。
## 6.3.1 一個復雜查詢還是多個簡單查詢
MySQL從設計上讓連接和斷開連接都很輕量級,在返回一個小的查詢結果方面很高效
所以運行多個小查詢現在已經不是大問題了。
MySQL內部每秒能夠掃描內存中上百萬行數據,相比之下,MySQL響應數據給客戶端就慢得多了
## 6.3.2 切分查詢
將一個大的DELETE語句切分成多個較小的查詢可以盡可能小地影響MySQL性能,同時還可以減少MySQL復制的延遲。例如,我們需要每個月運行一次下面的查詢:

一次刪除一萬行數據一般來說是一個比較高效而且對服務器影響也最小的做法(如果是事務型引擎,很多時候小事務能夠更高效)。同時,需要注意的是,如果每次刪除數據后,都暫停一會兒再做下一次刪除,這樣也可以將服務器上原本一次性的壓力分散到一個很長的時間段中,就可以大大降低對服務器的影響,還可以大大減少刪除時鎖的持有時間
## 6.3.3 分解關聯查詢
對關聯查詢進行分解。可以對每一個表進行一次單表查詢,然后將結果在應用程序中進行關聯。

* 讓緩存的效率更高。許多應用程序可以方便地緩存單表查詢對應的結果對象。例如,上面查詢中的tag已經被緩存了,那么應用就可以跳過第一個查詢。再例如,應用中已經緩存了ID為123、567、9098的內容,那么第三個查詢的IN()中就可以少幾個ID。
對MySQL的查詢緩存來說,如果關聯中的某個表發生了變化,那么就無法使用查詢緩存了,而拆分后,如果某個表很少改變,那么基于該表的查詢就可以重復利用查詢緩存結果了。
* 將查詢分解后,執行單個查詢可以減少鎖的競爭。
* 在應用層做關聯,可以更容易對數據庫進行拆分,更容易做到高性能和可擴展。
* 查詢本身效率也可能會有所提升。這個例子中,使用IN()代替關聯查詢,可以讓MySQL按照ID順序進行查詢,這可能比隨機的關聯要更高效。
* 可以減少冗余記錄的查詢。在應用層做關聯查詢,意味著對于某條記錄應用只需要查詢一次,而在數據庫中做關聯查詢,則可能需要重復地訪問一部分數據。從這點看,這樣的重構還可能會減少網絡和內存的消耗。
* 更進一步,這樣做相當于在應用中實現了哈希關聯,而不是使用MySQL的嵌套循環關聯。某些場景哈希關聯的效率要高很多。
通過重構查詢將關聯放到應用程序中將會更加高效,這樣的場景有很多,比如:當應用能夠方便地緩存單個查詢的結果的時候、當可以將數據分布到不同的MySQL服務器上的時候、當能夠使用IN()的方式代替關聯查詢的時候、當查詢中使用同一個數據表的時候。