您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關怎樣分析數據庫緩沖池與SQL查詢成本,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
磁盤 I/O 需要消耗的時間很多,而在內存中進行操作,效率則會高很多,為了能讓數據表或者索引中的數據隨時被我們所用,DBMS 會申請占用內存來作為數據緩沖池,這樣做的好處是可以讓磁盤活動最小化,從而減少與磁盤直接進行 I/O 的時間。要知道,這種策略對提升 SQL 語句的查詢性能來說至關重要。如果索引的數據在緩沖池里,那么訪問的成本就會降低很多。
那么緩沖池如何讀取數據呢?
緩沖池管理器會盡量將經常使用的數據保存起來,在數據庫進行頁面讀操作的時候,首先會判斷該頁面是否在緩沖池中,如果存在就直接讀取,如果不存在,就會通過內存或磁盤將頁面存放到緩沖池中再進行讀取。
如果使用的是 MyISAM 存儲引擎(只緩存索引,不緩存數據),對應的鍵緩存參數為 key_buffer_size,可以用它進行查看。
如果使用的是 InnoDB 存儲引擎,可以通過查看 innodb_buffer_pool_size 變量來查看緩沖池的大小,命令如下:
mysql> show variables like 'innodb_buffer_pool_size';
mysql> set global innodb_buffer_pool_size = 1073741824;
在 InnoDB 存儲引擎中,可以同時開啟多個緩沖池,查看緩沖池的個數,使用命令:
mysql> show variables like 'innodb_buffer_pool_instances';
一條 SQL 查詢語句在執行前需要確定查詢計劃,如果存在多種查詢計劃的話,MySQL 會計算每個查詢計劃所需要的成本,從中選擇成本最小的一個作為最終執行的查詢計劃。
如果查看某條 SQL 語句的查詢成本,可以在執行完這條 SQL 語句之后,通過查看當前會話中的 last_query_cost 變量值來得到當前查詢的成本。這個查詢成本對應的是 SQL 語句所需要讀取的頁(page)的數量。
mysql> show status like 'last_query_cost'
example
mysql> select userid,rating from movierating where userid = 4169;
結果:2313 rows in set (0.05 sec)
mysql> show status like 'last_query_cost';
mysql> select userid,rating from movierating where userid between 4168 and 4175;
結果:2643 rows in set (0.01 sec)
mysql> show status like 'last_query_cost';
你能看到頁的數量是剛才的 1.4 倍,但是查詢的效率并沒有明顯的變化,實際上這兩個 SQL 查詢的時間基本上一樣,就是因為采用了順序讀取的方式將頁面一次性加載到緩沖池中,然后再進行查找。雖然頁數量(last_query_cost)增加了不少,但是通過緩沖池的機制,并沒有增加多少查詢時間。
以上就是怎樣分析數據庫緩沖池與SQL查詢成本,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。