mysql資料庫優化的一些記錄

2021-08-09 17:50:47 字數 2515 閱讀 1647

庫表設計時應該為每張表都設定乙個id作為其主鍵,最好是int型(推薦使用unsigned),並設定上自動增加的auto_increment,使用varchar型別來當主鍵會使得效能下降。

有留意過大型電商**的表字段,使用者編號,訂單編號等都是int型,且訂單編號有一定的規則,具體的沒研究過,除錯一號店介面的時候發現訂單編號的後3位和使用者編號的後3位是一樣的。

# mysql的heap(堆積)表緩衝大小。所有聯合在乙個dml指令內完成,並且大多數聯合甚至可以不用臨時錶即可以完成。

# 大多數臨時表是基於記憶體的(heap)表。具有大的記錄長度的臨時表 (所有列的長度的和)或包含blob列的表儲存在硬碟上。

# 如果某個內部heap(堆積)表大小超過tmp_table_size,mysql可以根據需要自動將記憶體中的heap表改為基於硬碟的myisam表。還可以通過設定tmp_table_size選項來增加臨時表的大小。也就是說,如果調高該值,mysql同時將增加heap表的大小,可達到提高聯接查詢速度的效果

(查詢快取)是乙個眾所周知的瓶頸,甚至在併發並不多的時候也是如此。 最佳選項是將其從一開始就停用,設定query_cache_size = 0(現在mysql 5.6的預設值)並利用其他方法加速查詢:優化索引、增加拷貝分散負載或者啟用額外的快取(比如memcache或redis)。如果你已經為你的應用啟用了query cache並且還沒有發現任何問題,query cache可能對你有用。這是如果你想停用它,那就得小心了。

一般高併發,寫入量大的系統,建議禁掉

myisam表發生變化時重新排序所需的緩衝

設定為cpu核數的兩倍,比如4個cpu,每個cpu為8核,則設定為4*8*2=64

表掃瞄情況

mysql> show global status like 'handler_read%';

+-----------------------+-------------+

| variable_name       | value    |

+-----------------------+-------------+

| handler_read_first | 5803750     |

| handler_read_key    | 6049319850   |

| handler_read_next     | 94440908210 |

| handler_read_prev     | 34822001724 |

| handler_read_rnd    | 405482605 |

| handler_read_rnd_next | 18912877839 |

+-----------------------+-------------+

調出伺服器完成的查詢請求次數:
mysql> show global status like 'com_select';

+---------------+-----------+

| variable_name | value     |

+---------------+-----------+

| com_select | 222693559 |

+---------------+-----------+

計算表掃瞄率:

表掃瞄率 = handler_read_rnd_next / com_select

如果表掃瞄率超過4000,說明進行了太多表掃瞄,很有可能索引沒有建好,增加read_buffer_size值會有一些好處,但最好不要超過8mb

。table_open_cache

table_open_cache指定表快取記憶體的大小。每當mysql訪問乙個表時,如果在表緩衝區中還有空間,該錶就被開啟並放入其中,這樣可以更快地訪問表內容。

通過檢查峰值時間的狀態值open_tables和opened_tables,可以決定是否需要增加table_open_cache的值。

如果你發現open_tables

等於table_open_cache

,並且opened_tables

在不斷增長,那麼你就需要增加table_open_cache的值了(上述狀態值可通過show global status like 『open%tables』獲得)。

發現open_tables等於table_open_cache,都是512,說明mysql正在將快取的表釋放以容納新的表,此時可能需要加大table_open_cache的值,4g記憶體的機器,建議設定為2048

比較適合的值:

open_tables / opened_tables >= 0.85

open_tables / table_open_cache <= 0.95

如果對此引數的把握不是很準,有個很保守的設定建議:把mysql資料庫放在生產環境中試執行一段時間,然後把引數的值調整得比opened_tables的數值大一些,並且保證在比較高負載的極端條件下依然比opened_tables略大。

資料庫一些記錄

資料庫三大正規化 第一正規化 1nf 資料表中的每一列 每個字段 必須是不可拆分的最小單元,也就是確保每一列的原子性。解釋 每一列屬性都是不可再分的屬性值,確保每一列的原子性,如果兩列的屬性相近或相似或一樣,盡量合併屬性一樣的列,確保不產生冗餘資料。第二正規化 2nf 滿足1nf後,要求表中的所有列...

資料庫的一些記錄

存表情的字段要用utf8mb4 general ci排序規則 mysql 清空表 id重置 truncatetable表名 mssql mysql 沒試過 儲存過程中用in匹配多個條件,要用find in set 列名,匹配字段 例子 select from 表名 where find in set...

一些mysql資料庫效能優化方法

一 mysql 資料庫效能優化之sql優化 注 這篇文章是以 mysql 為背景,很多內容同時適用於其他關係型資料庫,需要有一些索引知識為基礎 盡量避免 select 很多人看到這一點後覺得比較難理解,上面不是在誤區中剛剛說 select 子句中字段的多少並不會影響到讀取的資料嗎?是的,大多數時候並...