MySql與數(shù)據(jù)庫設(shè)計規(guī)范

1. 用Homebrew進行安裝

brew install mysql

一直等到出現(xiàn)

We've installed your MySQL database without a root password. To secure it run:
    mysql_secure_installation

MySQL is configured to only allow connections from localhost by default

To connect run:
    mysql -uroot

To have launchd start mysql now and restart at login:
  brew services start mysql
Or, if you don't want/need a background service you can just run:
  mysql.server start

安裝成功.

2. 對數(shù)據(jù)庫進行初始化配置

  • 啟動服務(wù)
mysql.server start
  • 初始化配置
mysql_secure_installation

根據(jù)提示進行數(shù)據(jù)庫的配置
是否需要配置密碼

Press y|Y for Yes, any other key for No: // 選擇Y則需要配置8位數(shù)的密碼

輸入Y以后, 可以看到提示

LOW    Length >= 8  // 長度大于等于8就可以
MEDIUM Length >= 8, numeric, mixed case, and special characters // 長度大于8數(shù)字、混合大小寫和特殊字符
STRONG Length >= 8, numeric, mixed case, special characters and dictionary  //  長度>= 8,數(shù)字,混合大小寫,特殊字符和字典
file 
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:

這里根據(jù)你的要求輸入0 , 1 , 2就可以
然后會提示你輸入密碼

Please set the password for root here.

New password:

然后確認密碼:

Re-enter new password:

如果密碼輸入的不符合要求, 會這樣提示

Estimated strength of the password: 25
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
 ... Failed! Error: Your password does not satisfy the current policy requirements

當密碼設(shè)置成功以后

是否移除不用密碼的那個賬戶

Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : //  是否移除不用密碼的那個賬戶

輸入

Y

是否禁止遠程登錄

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : // 是否禁止遠程登錄

輸入

N

是否刪除test庫

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : // 是否刪除test庫

輸入

Y

是否重新加載

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : // 是否重新加載

輸入

Y

回車以后就可以看到

All done!

登錄數(shù)據(jù)庫

mysql -uroot -p

輸入剛剛的密碼, 就能夠登錄上現(xiàn)在的數(shù)據(jù)庫了.

數(shù)據(jù)庫服務(wù)

啟動:brew services start mysql

停止:brew services stop mysql

數(shù)據(jù)庫設(shè)計規(guī)范

數(shù)據(jù)庫命名規(guī)范

  • 所有數(shù)據(jù)庫對象名稱必須使用小寫字母并用下劃線分割
  • 所有數(shù)據(jù)庫名稱禁止使用MySQL保留關(guān)鍵字
  • 數(shù)據(jù)庫對象的命名要做到見名知義, 并且不要超過32個字符
  • 臨時庫表必須以temp為前綴, 并且以日期為后綴
  • 備份庫, 備份表必須以bak為前綴并以日期為后綴
  • 所有存儲想同數(shù)據(jù)的列名和列類型必須一致

數(shù)據(jù)庫基本設(shè)計類型

  • 所有表必須使用InnoDB存儲引擎
    • mysql5.6版本以后InnoDB為默認引擎
    • 支持事務(wù), 行級鎖, 更好的恢復(fù)性, 高并發(fā)下性能更好
  • 數(shù)據(jù)庫和表的字符集統(tǒng)一使用UTF8, 如果存儲表情, 需要UTF8的擴展
    • 可以避免字符集的亂碼問題
  • 所有的表和字段都需要添加注釋
    • 防止數(shù)據(jù)庫字典的維護, 防止人員流失導(dǎo)致不知是啥
  • 盡量控制單表數(shù)據(jù)量的大小, 建議控制在500萬以內(nèi)
    • 500萬并不是MySQL數(shù)據(jù)庫的限制, MySQL并為對大小做限制
  • 謹慎的使用MySQL分區(qū)表
    • 分區(qū)表在物理上表現(xiàn)為多個文件, 在邏輯上表現(xiàn)為1個表, 查詢效率會降低
    • 建議使用物理分表
  • 盡量做到冷熱數(shù)據(jù)分離, 減小表的寬度
    • 減少磁盤IO, 保證熱數(shù)據(jù)的內(nèi)存緩存命中率
    • 利用更有效的利用緩存, 避免讀入無用的冷數(shù)據(jù)
    • MySQL最多4096列
  • 禁止預(yù)留字段
  • 禁止在數(shù)據(jù)庫中存儲圖片/文件等二進制文件
  • 禁止在線上數(shù)據(jù)庫做壓力測試
  • 禁止從開發(fā)/測試環(huán)境直接連接線上數(shù)據(jù)庫

索引設(shè)計規(guī)范

  • 限制單張表上的索引數(shù)量, 單張表索引不超過5個
    • 索引可以提高效率, 同事降低插入效率
    • 禁止給表中的每一列都建立單獨的索引
  • 每個InnoDB表必須有一個主鍵
    • 如果沒有主鍵, 那么會以第一個非空字段為主鍵
    • 不能使用更新頻繁的列作為主鍵, 不使用多列主鍵
    • 不使用UUID, MD5, HASH, 字符串列為主鍵
    • 主鍵建議使用自增ID值
  • 常見索引列建議
    • 在SELECT, UPDATE, DELETE等語句的WHERE從句中的列作為索引
    • 包含在ORDER BY, GROUP BY, DISTINCT中的字段
    • 多表JOIN的關(guān)聯(lián)列
    • 一般建立一個聯(lián)合索引, 效率更高
  • 如何使用索引列的順序(MySQL從左到右)
    • 區(qū)分度最高的列放在聯(lián)合索引在最左側(cè)
    • 盡量把字段長度小的列放在聯(lián)合索引的最左側(cè)
    • 使用最頻繁的列放到聯(lián)合索引的左側(cè)
  • 避免建立冗余索引和重復(fù)索引, 主鍵就是一個唯一, 非空的索引
  • 對于頻繁的查詢優(yōu)先考慮使用覆蓋索引
    • 覆蓋索引: 就是包含了所有查詢字段的索引
    • 避免了InnoDB表進行索引的二次查找
    • 可以把隨機IO變?yōu)轫樞騃O加快查詢效率
  • 避免使用外鍵
    • 降低寫的性能
    • 建議在業(yè)務(wù)端實現(xiàn)

數(shù)據(jù)庫字段設(shè)計規(guī)范

  • 優(yōu)先選擇符合存儲需要的最小的數(shù)據(jù)類型
    • 盡量將字符串轉(zhuǎn)化為數(shù)字類型存儲, 比如IP地址, 使用INET_ATON將字符串轉(zhuǎn)成整型, 使用INET_NTOA將整型轉(zhuǎn)化為字符串
    • 對于非負數(shù)據(jù)采用無符號整型進行存儲
    • VARCHAR(N)中N代表的是字符數(shù), 而不是字節(jié)數(shù), 使用UTF8存儲漢字VARCHAR(255)=765個字節(jié)
    • 過大的長度會消耗更多的內(nèi)存
  • 避免使用TEXT, BLOB數(shù)據(jù)類型
  • 避免使用ENUM數(shù)據(jù)類型
  • 盡量把所有的列定義為NOT NULL
    • 索引NULL列需要額外空間來保存
    • 進行比較和計算時, NULL需要額外處理
  • 禁止使用使用字符串存儲日期
    • 使用TIMESTAMP(4個字節(jié))或DATETIME(8個字節(jié))類型
  • 財務(wù)相關(guān)的必須使用Decimal類型

數(shù)據(jù)庫SQL開發(fā)規(guī)范

  • 建議使用預(yù)編譯語句進行數(shù)據(jù)庫操作, 防止sql注入等問題
  • 避免數(shù)據(jù)類型的隱士轉(zhuǎn)換
    • 隱士轉(zhuǎn)換會導(dǎo)致索引失效
  • 充分使用表上已經(jīng)存在的索引, 避免使用雙%號的查詢條件
  • 程序連接不同的數(shù)據(jù)庫使用不同的賬號, 禁止跨庫查詢
  • 禁止使用SELECT *來查詢
    • 消耗更多的CPUI和IO以及網(wǎng)絡(luò)帶寬資源
    • 無法使用覆蓋索引
    • 可減少表結(jié)構(gòu)變更帶來的影響
  • 禁止使用不含字段列表的INSERT語句
  • 禁止使用子查詢, 可以把子查詢優(yōu)化為join操作
  • 避免使用JOIN關(guān)聯(lián)太多的表
    • MySQL最多允許關(guān)聯(lián)61個表, 建議不超過5個
  • 減少同數(shù)據(jù)庫的交互操作
    • 數(shù)據(jù)庫更適合處理批量操作
  • 禁止使用order by rand()進行隨機排序
    • 會把表中符合條件的數(shù)據(jù)裝在到內(nèi)存中進行排序
    • 會消耗大量的CPU和IO以及內(nèi)存資源
    • 建議在程序中獲取一個隨機值, 然后從數(shù)據(jù)庫中獲取數(shù)據(jù)的方式
  • WHERE從句中禁止對列進行函數(shù)轉(zhuǎn)換和計算
  • 拆分復(fù)雜的大SQL為多個小SQL
    • MySQL一個SQL只能使用一個CPU進行計算
    • SQL拆分后可以提高效率
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容