mysql資料持久化 詳解mysql持久化統計資訊

2021-10-17 15:26:48 字數 3188 閱讀 8470

一、持久化統計資訊的意義:

統計資訊用於指導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實際上指的只是innodb這個引擎

Docker之Mysql資料持久化

拉取最新版本 也可以指定版本 docker pull mysql檢查本地映象檔案 建立配置檔案存放位置 和資料對映位置 mkdir p mysql config mysql data建立編輯配置檔案 vi mysql config my.confmy.conf配置檔案內容如下 mysqld user...

資料持久化

資料持久化就是將記憶體中的資料模型轉換為儲存模型,以及將儲存模型轉換為記憶體中的資料模型的統稱.資料模型可以是任何資料結構或物件模型,儲存模型可以是關係模型 xml 二進位製流等。cmp和hibernate只是物件模型到關係模型之間轉換的不同實現。只不過物件模型和關係模型應用廣泛,所以就會誤認為資料...

資料持久化

首先是cocos2d x自己封閉的ccuserdefault跨平台的檔案儲存類,它是用的xml格式,具體操作非常類似於應用開發的ini檔案,可操作性不是很強,如果訪問比較複雜的資料,那就得自己動手去解析乙個字串,下面是示例 基本一看就懂 void userdefaulttest dotest els...