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拆分后可以提高效率