mysql-5.7 持久化統計信息詳解


一、持久化統計信息的意義:

  統計信息用於指導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 參數來控制更新

  統計信息時的采樣,樣本頁面的數量。

[mysqld]
innodb_stats_persistent=1
innodb_stats_auto_recalc=1
innodb_stats_persistent_sample_pages=20

 

四、手動更新統計信息的方式:

  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實際上指的只是Innodb這個引擎

 

----

-----------------------------------------------------------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM