您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關利用mysql怎么統計持久化信息,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
一、持久化統計信息的意義:
統計信息用于指導mysql生成執行計劃,執行計劃的準確與否直接影響到SQL的執行效率;如果mysql一重啟
之前的統計信息就沒有了,那么當SQL語句來臨時,那么mysql就要收集統計信息然后再生成SQL語句的執行
計劃。如果能在關閉mysql的時候就把統計信息保存起來,那么在啟動時就不要再收集一次了,這種處理方式
有助于效率的提升。
二、統計信息準確與否也同樣重要:
第一目中我們說明了“持久化統計信息的意義”,我們的假設統計信息是有用的,是準確的;如果統計信息本身
已經過時了,比如說統計信息是在表中只有100行時統計出來的,這種情況下往往走全表掃描開銷會更小,但是
呢! 現在表中的行數已經達到了100萬行,明顯這種過時的統計信息會引發性能災難,所以統計信息的時效性也
是同樣重要的。那mysql它什么時候自動更新統計信息呢?默認情況下當表中的數據有10%被修改過的就會更新。
三、mysql對統計信息的處理:
針對上面的兩個問題mysql都有給出解決方案,并且都可能通過簡單的配置來解決
1、針對是否持久化統計信息mysql可以通過innodb_stats_persistent參數來控制
2、針對統計信息的時效性,mysql通過innodb_stats_auto_recalc參數來控制是否自動更新
3、針對統計信息的準確性,mysql通過innodb_stats_persistent_sample_pages 參數來控制更新
統計信息時的采樣,樣本頁面的數量。
四、手動更新統計信息的方式:
mysql通過analyze table 語句來手動的更新統計信息
五、查看表的統計信息是什么時候更新的:
mysql把統計信息相關的內容記錄在mysql.innodb_table_stats ,mysql.innodb_index_stats 這兩張表里面。
mysql.innodb_table_stats以表為單位記錄著統計信息
mysql> select * from innodb_table_stats; +---------------+----------------------------+---------------------+--------+----------------------+--------------------------+ | database_name | table_name | last_update | n_rows | clustered_index_size | sum_of_other_index_sizes | +---------------+----------------------------+---------------------+--------+----------------------+--------------------------+ | fdb | auth_group | 2017-08-10 14:36:40 | 0 | 1 | 1 | | fdb | auth_group_permissions | 2017-08-10 14:36:41 | 0 | 1 | 2 | | fdb | auth_permission | 2017-08-10 14:36:41 | 30 | 1 | 1 | | fdb | auth_user | 2017-08-10 14:36:41 | 0 | 1 | 1 | | fdb | auth_user_groups | 2017-08-10 14:36:41 | 0 | 1 | 2 | | fdb | auth_user_user_permissions | 2017-08-10 14:36:41 | 0 | 1 | 2 | | fdb | cninfo_company | 2017-08-10 14:36:58 | 4996 | 161 | 6 | | fdb | csindex_indexdetail | 2017-09-17 14:04:27 | 0 | 1 | 0 | | fdb | csindex_indexoverview | 2017-09-01 12:44:18 | 11 | 1 | 0 | | fdb | django_admin_log | 2017-08-10 14:36:47 | 0 | 1 | 2 | | fdb | django_content_type | 2017-08-10 14:36:47 | 10 | 1 | 1 | | fdb | django_migrations | 2017-09-04 14:04:09 | 37 | 1 | 0 | | fdb | django_session | 2017-08-10 14:36:47 | 0 | 1 | 1 | | fdb | glod_glodprice | 2017-08-10 14:36:48 | 2271 | 10 | 0 | | fdb | pbc_moneysupply | 2017-08-10 14:37:08 | 78 | 1 | 0 | | fdb | shibor_shiborrate | 2017-08-10 14:37:18 | 2711 | 14 | 0 | | fdb | sse_marketoverview | 2017-08-15 16:06:12 | 0 | 1 | 0 | | mysql | gtid_executed | 2017-09-06 11:02:14 | 2 | 1 | 0 | | sys | sys_config | 2017-08-10 12:19:06 | 6 | 1 | 0 | | tempdb | person | 2017-09-14 11:18:15 | 1 | 1 | 0 | | tmp | t | 2017-08-15 11:06:18 | 2 | 1 | 0 | +---------------+----------------------------+---------------------+--------+----------------------+--------------------------+ 21 rows in set (0.00 sec)
各個列所代表的意義:
database_name 表所在的庫名
table_name 表名
last_update 最近一次的更新時間
n_rows 表中的行數
clustered_index_size 主鍵的大小
sum_of_other_index_sizes 所有二級索引的大小
六、一些在analyze table 過程中的經驗:
如果我們用explan 語句查看SQL的執行計劃的時候發現,計劃走的不準,多半是由于統計信息過時引起的,這個
時候就要執行一下analyze table 來重新生成一下執行計劃了;有時候可能發現重新生成執行計劃后并沒有什么用
SQL還是走的不準,這個時候最可能的原因就是生成執行計劃時的采樣頁的數量太低了,innodb_stats_persistent_sample_pages
這個參數的值,注意這個值也不要加的太大,要不然會老半天都執行不完analyze table 語句。
以上就是利用mysql怎么統計持久化信息,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。