看曹政如何減少SQL請求

來源:互聯網
上載者:User

首先為了防止某些專業挑刺人士無限制發揮,先聲明幾個前提

1:索引最佳化是基礎工作,沒做好這個其他的不用提,但本文不展開此內容。

2:最佳化資料庫查詢有非常多的分支,減少SQL請求只是其中一個領域,其他分支本文不涉及。

3:在部分情境下,甚至需要增加SQL以解決諸如分布式或其他問題,本文不涉及。

4:營運最佳化和其他最佳化手段本文不涉及。

5:產品商務邏輯最佳化本文不涉及。

6:其他本文沒提到的內容歡迎自行聯想,技術水準高超者請忽略本文。

第一 查詢請求的分析和裁剪

線上系統,出現請求較多,資料壓力較大索引最佳化到位的前提下),我會讓程式員輸出一段時間的查詢請求。通常資料庫操作有封裝對象,直接記錄日誌即可,建議寫入/dev/shm 以減少i/o壓力,如果請求頻次實在很高,可以取一定比例寫入日誌),然後基於日誌分析。

1、完全一致的查詢請求有多少,平均每秒會出現多少這樣的查詢。

比如常見的,所有頁面都載入系統資訊 select * from systeminfo;

2、基於同一資料表同一主鍵的查詢有多少,平均每秒會出現多少這樣的查詢

比如 select name from userinfo where uid=10134;  select email from userinfo where uid=10134;

這兩種請求,是可以通過建立緩衝機制來最佳化的,

而且做了這個分析,會有一個很好的資料認知

當前資料庫每秒處理多少查詢請求,其中可最佳化的冗餘請求有多少,如果建立緩衝可以減少多少請求。提升系統支撐性多少?

對於一些不是特別出色的開源系統,分析一下會發現,可裁剪的查詢請求是非常巨大的。

第二 更新要求的分析和裁剪

更新要求也可以最佳化,

我們一般用mysql的情況下,是先解開binlog檔案,還原為文字檔,然後分析

基於同一資料表,同一主鍵的更新要求有多少,平均每個時間段出現多少這樣的請求

舉例1:

update user set lastacttime=.... where uid=10314; 經常更新最後活躍時間

舉例2:

update posts set views=views+1 where pid=10004211; 更新同一個文章顯示數字

如果這樣的請求較多,那麼可以有針對性的建立隊列,定時非同步更新。

在非同步更新過程中

範例1 多條請求只要記住同一主鍵最後一條即可;

範例2 多條請求可以在程式中合并,對資料庫操作只進行一次。

這樣更新要求頻次就極大下降了。

如果線上有即時性要求,線上可以保持一個記憶體資料做同步更新。

方法其實很簡單,但是很有效

簡單總結

第一,要隨時瞭解自己的讀寫請求頻次情況

第二,一定時間範圍內針對同資料表,同主鍵的讀寫請求,均是可最佳化,可裁剪的,但是也要考慮當時的系統負載構成和請求頻次、影響度,抓大放小,解決主要問題即可。

就這樣,其他方面,參見前提說明。

編輯精選】

  1. 恢複SQL Server簡單模式下誤刪除堆表記錄
  2. 微軟SQL Server資料引擎和分析服務
  3. SQL Server資料採礦規則實現商品推薦1
  4. SQL Server進階內容:子查詢和錶鏈接
  5. SQL Server 2008中資料壓縮

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.