Mysql效能優化 1 從新建乙個表開始

2021-07-23 17:36:28 字數 3701 閱讀 6806

前方預警,本文不太適合老司機閱讀,畢竟工作幾年的老司機都有自己一套mysql優化的套路,此文適合接觸了mysql但是不是很深入了解mysql的人閱讀。

當使用mysql的時候,我們操作的單位就是表,而乙個表的設計從乙個開始就決定著mysql的效能優化,有些貌似看起來合理的,卻在蒙蔽自己的眼睛。只有一層層剝開,才會慢慢發現,最本質的才是最真的。

新建乙個表最先想到的就是表名,最常見的命名方式為t_***x。其次是欄位名。我習慣於使用fui***xfstr***x這兩種形式的命名方式。其中「f」是field的縮寫,「ui」 是unsigned int的縮寫,」str」自然是string的縮寫。通過欄位的字首能夠清楚知道簡訊的大概型別。當然有人會問,為什麼沒有標識浮點數。這是因為個人喜歡將浮點數放大n倍儲存為乙個較大的整形放在資料庫,這樣做的目的一方面是因為整形運算會比浮點運算快,另一方面是因為浮點運算會有精度丟失問題,有時候會造成嚴重影響,比如資金方面的運算可能會造成對賬對不平。當然每個人或著每個公司都有自己的命名方案,乙個好的命名在程式開發中將帶來可觀的效率。

開發中最長建的表就是使用者基本資訊表t_user,在這個表中一般包含的字段包括,使用者id,姓名,暱稱,性別,年齡,郵箱,**號碼等。

很容易得到表的雛形。

create

table

ifnot

exists

`test`.`t_user` (

`fstruid`

varchar(32) not

null

default

'' comment '使用者id',

`fstrname`

varchar(16) not

null

default

'' comment '使用者姓名',

`fstrnick`

varchar(16) not

null

default

'' comment '使用者暱稱',

`fui***`

int unsigned not

null

default

0 comment '0-男,1-女',

`fuiage`

int unsigned not

null

default

0 comment '年齡',

`fstremail`

varchar(48) not

null

default

'' comment '郵箱',

`fstrmobile`

varchar(16) not

null

default

'' comment '**號碼')

engine = innodb default

character

set = utf8 comment '使用者基本資訊表'

在表的雛形中加入了 not null 約束,一般加入not null 約束的時候都需要給字段新增上default,當然不加入也沒有什麼事,但是當資料庫執行在嚴格模式的時候,插入會失敗。還有人會問,為什麼都要加入not null 約束?這是因為在mysql中,如果一列中含有null值的時候很難進行優化查詢,它會使得索引(後續會有bolg)的計算變得很複雜。所以新建表的時候,最好都加上not null 和 default,當然有的型別不能定義default除外。

細心的人或許會發現,雛形表中少了很關鍵的主鍵約束。是的,關於乙個表的主鍵約束定義,似乎很多很多欄位都很合理,fstruid一定可以,因為它絕對是唯一的。fstrmobile貌似也可以,很多平台都是乙個**號碼註冊的,也能保證唯一。但是如果使用者換手機了呢,這一點,就能說明**號碼不太合適。fstrnick似乎可以,很多平台這個欄位是不會變的,而且是唯一的。在我們的雛形表中適合做主鍵索引的貌似有fstruid和fstrnick,如果我選的話,我還是選fstruid合適。

實際上,真正的贏家一般都不會出場太早,適合做主鍵的是乙個叫自增id的字段。why?我當時也這樣懵圈過。經過一段時間站在巨人(google)肩膀上的學習,終於明白。在innodb引擎表中,它會選擇主鍵作為聚集索引,其資料結構為b+樹,當資料插入的時候,根據b+樹的插入規則,會引起節點的**,造成開銷。如果是自增主鍵,那麼每次插入新的記錄,記錄就會順序新增到當前索引節點的後續位置,當一頁寫滿,就會自動開闢乙個新的頁。如果是非自增主鍵,每次插入主鍵的值近似於隨機,新紀錄都要被插到現有索引頁的中間某個位置,造成巨大的開銷。具體的說明,可以參考部落格mysql中innodb表為什麼要建議用自增列做主鍵。

終上所述,最終得到的t_user表的樣式為

create

table

ifnot

exists

`test`.`t_user` (

`fuiid`

int unsigned not

null auto_increment comment '自增id',

`fuistatus`

int unsigned not

null

default

0 comment '使用者狀態,登出,凍結,正常...',

`fstruid`

varchar(32) not

null

default

'' comment '使用者id',

`fstrname`

varchar(16) not

null

default

'' comment '使用者姓名',

`fstrnick`

varchar(16) not

null

default

'' comment '使用者暱稱',

`fstrmobile`

varchar(16) not

null

default

'' comment '**號碼',

`fui***`

int unsigned not

null

default

0 comment '0-男,1-女',

`fuiage`

int unsigned not

null

default

0 comment '年齡',

`fstremail`

varchar(48) not

null

default

'' comment '郵箱',

`fuicreatetime`

int(20) unsigned not

null

default

'', `fuiupdatetime`

timestamp

notnull

default

'current_timestamp on update current_timestamp',

primary

key (`fuiid`),

unique index `fstruid_unique` (`fstruid`))

engine = innodb default

character

set = utf8 comment '使用者基本資訊表'

表建好了,對錶的操作無非就是增,刪,該,查。如果做到這些操作都高效的執行?優化之路漫漫,修行之路才剛剛開始。

MySQL效能優化(1)

json型別 例項 mysql資料庫由後台執行緒及乙個共享記憶體區組成,資料庫例項才是真正用於運算元據庫檔案的程式集,是乙個動態概念。多例項就是在一台伺服器上同時開啟多個不同的資料庫服務埠 例如3306 3307 同時執行多個資料庫程序就是多例項。優點 充分利用伺服器資源。缺點 資源搶占問題。中小型...

1 如何新建乙個ARM工程

準備工作 建立工程資料夾,在其下面新增output,source這兩個資料夾 如下 ps 所有資料夾 包括工程的路徑上的資料夾 名字一定要是要英文,這是因為中文在某些情況下會出現未知編譯錯誤。移動標準庫檔案中的標頭檔案和對應子檔案 到source資料夾,我使用的是stm32f10x stdperip...

mysql效能優化 一

mysql裡面的所分為表鎖和行鎖不同儲存引擎它的鎖也不一樣,innodb有表鎖和行鎖,而mysiam只有表鎖 1.set autocommit 0 取消自動提交 2.使用a,b兩個視窗分別update同一行資料,過濾條件必須是索引,因為索引是行鎖,非索引是表鎖 a視窗先update資料,b視窗後up...