性能監(jiān)控

Schema與數(shù)據(jù)類型優(yōu)化
數(shù)據(jù)類型的優(yōu)化
更好的通常更好
簡單就好
整型字符操作代價更低,因為字符集和校對規(guī)則是字符比較比整型比較更復雜
使用 mysql 自建類型而不是字符串來存儲日期和時間
用整型存儲 IP 地址
盡量避免 null
如果查詢重包含可為 NULL 的列,對 mysql 來說很難優(yōu)化,因為可為 null 的列使得索引,索引統(tǒng)計和值比較都更加復雜,坦白來說,通常情況下 null 的列改為 not null 帶來的性能提升比較小,所以沒有比較要將所有的表的 schema 進行修改,但是應(yīng)該盡量避免設(shè)計成可為 null 的列
實際細則
整數(shù)類型:可以使用的幾種數(shù)據(jù)類型 :TINYINT,SMALINT,MEDIUMINT,INT,BIGINT 分別使用 8,16,32,64 位存儲空間,盡量使用滿足需求的最小數(shù)據(jù)類型
合理使用范式和反范式
范式
優(yōu)點:
當范式化的更新通常比反范式要快
當數(shù)據(jù)據(jù)好的范式化后,很少或者沒有重復的數(shù)據(jù)
范式化的數(shù)據(jù)比較小,可以放在內(nèi)存中,操作比較快
缺點:
通常需要進行關(guān)聯(lián)
反范式
優(yōu)點:
所有的數(shù)據(jù)都在同一張表中,可以避免關(guān)聯(lián)
可以設(shè)計有效的索引
缺點:
表格內(nèi)的冗余較多,刪除數(shù)據(jù)會造成有些表有用的信息丟失
字符與字符串類型
varchar 根據(jù)實際內(nèi)容長度保存數(shù)據(jù)
使用最小的符合需求的長度。
varchar(n) n小于等于 255 使用額外一個字節(jié)保存長度, n > 255 使用額外兩個字節(jié)保存長度
varchar(5) 與 varchar(255) 保存同樣的內(nèi)容,磁盤存儲空間相同,但內(nèi)存占用不同,是指定大小
varchar 在 mysql5.6 之前變更長度,或者從 255 以下變更到 255 以上時,都會導致鎖表
應(yīng)用場景
存儲長度波動較大的數(shù)據(jù),如:文章,有的會很短,有的會很長
字符串很少更新的場景,每次更新后都會重新算并使用額外存儲空間保存長度
適合保存多字節(jié)字符,如:漢字,特殊字符等。
char 固定長度的字符串
最大長度:255
會自動刪除末尾的空格
檢索效率,寫效率會比 varchar 高,以空間換時間
應(yīng)用場景
存儲長度波動不大的數(shù)據(jù),如:MD5 摘要
存儲短字符串、經(jīng)常更新的字符串
BLOD 和 TEXT 類型
MySQL 把每個 BLOB 和 TEXT 值當作一個個獨立的對象處理。
兩者都是為了存儲很大數(shù)據(jù)而設(shè)計的字符串類型,分別采用二進制和字符方式存儲
索引優(yōu)化
B 樹
B 樹特點:
所有鍵值分布在整顆樹中
搜索有可能在非葉子結(jié)點結(jié)束,在關(guān)鍵字全集內(nèi)做一次查找,性能逼近二分查找
每個節(jié)點最多擁有 m 個子樹
根節(jié)點至少有 2 個子樹
分支節(jié)點至少擁有 m/2 棵子樹(處根節(jié)點和葉子節(jié)點外都是分支節(jié)點)
所有葉子節(jié)點都在同一層,每個節(jié)點最多可以有 m - 1 個 key 并且以升序排列

B+ 樹

注意:在 B+Tree 上有兩個頭指針,一個指向根節(jié)點,另一個指向關(guān)鍵字最小的葉子節(jié)點,而且所有葉子節(jié)點(即數(shù)據(jù)節(jié)點)之間也是一種鏈式環(huán)結(jié)構(gòu)。因此可以對 B + Tree 進行兩種查找運算:一種是對于主鍵的范圍查找和分頁查找,另一種是從根節(jié)點開始,進行隨機查找.
數(shù)據(jù)庫引擎——InnoDB

注意:
InnoDB 是通過 B+Tree 結(jié)構(gòu)對主鍵創(chuàng)建索引,然后葉子節(jié)點中存儲記錄,如果沒有主鍵,那么會選擇唯一鍵,如果沒有唯一鍵,那么會生成一個 6 位的 row_id 來作為主鍵
如果創(chuàng)建索引的鍵是其他字段,那么在葉子節(jié)點中存儲的是該記錄的主鍵,然后再通過主鍵索引找到對應(yīng)的記錄,叫做回表