上篇文章:聊聊數據庫~開篇 http://www.javashuo.com/article/p-kmvgjgda-eh.htmlhtml
原本準備直接開講NoSQL的(當時開篇就是說的NoSQL)考慮到有些同志可能連MySQL系都沒接觸過,因此咱們2019說數據系的時候預計從MySQL
(穿插MSSQL
)開始,這篇文章就當試水篇,效果好就繼續往下寫~(這篇偏理論和運維)mysql
官方文檔:https://mariadb.com/kb/zh-cn/mariadb
git
目前主流:MySQL 5.7
or MariaDB 5.5.x
(推薦)github
多一句嘴,MySQL
當年被Oracle
收購後,MySQL之父
以爲靠Oracle
維護MySQL
很不靠譜,而後就跳槽弄了個MariaDB
(不少Oracle
競爭對手扶持着),目前MariaDB
是發展最快的MySQL
分支版本(PS:MySQL
如今是雙協議了,大部分公司用的版本都是<=5.7
)sql
而後得說下遷移問題:MySQL 5.x
到 MariaDB 5.x
基本上是無縫的,MariaDB最新穩定版爲:MariaDB 5.5
shell
PS:MariaDB有兩個分支,而10.x分支是不兼容MySQL的數據庫
MariaDB
與MySQL
兼容性能夠查看:ubuntu
https://mariadb.com/kb/zh-cn/mariadb-vs-mysql-compatibility/centos
PS:國內比較火的還有阿里的MySQL分支
:https://github.com/alibaba/AliSQL
安全
不談其餘的,我們看看它們開發的積極程度就知道爲何MariaDB
是主流了
若是想要使用MariaDB10.x
的同志能夠考慮MySQL8.x
(社區完善)
若是想要使用MySQL5.x
的同志能夠考慮MariaDB5.5.x
(高性能且兼容)
網絡配置若是不會能夠看我之前寫的文章:http://www.javashuo.com/article/p-xulcawzr-by.html
安裝很簡單,以CentOS
爲例:
systemctl start mariadb.service # 啓動MariaDB systemctl enable mariadb.service # 設置開機啓動 systemctl stop mariadb.service # 中止MariaDB systemctl restart mariadb.service # 重啓MariaDB
PS:Win安裝注意這一步:
執行文件簡單說明:有時候咱們 ps aux | grep mysql
的時候,發現運行的並非/usr/bin/
下的mysqld
而是mysqld_safe
,那這個mysqld_safe
是啥呢?==> 線程安全的實例
MariaDB
的程序組成:ls /usr/bin | grep mysql
mysql
命令行客戶端mysqldump
數據庫備份用mysqladmin
遠程管理工具mysqlbinlog
二進制日誌管理工具mysqld_safe
線程安全的實例mysqld_multi
多實例mysqld
mysql_secure_installation
安全初始化工具(記得先啓動數據庫哦)mysql
的帳號由兩部分組成:username
@host
,MySQL客戶端鏈接參數:
-u用戶名
:--user
,默認爲root
-h服務器主機
:--host
,默認爲localhost
host
用於限制用戶能夠經過哪些主機鏈接%
匹配任意長度的任意字符:172.16.0.0/16 ==> 172.16.%.%_
匹配任意單個字符-p密碼
:--password
,默認爲空
mysql_secure_installation
來設置密碼並初始化-P
:--port
,指定端口-D
:--database
,指定數據庫-C
:--compress
,鏈接數據庫的時候對傳輸的數據壓縮-S
:--socket
,指定socket文件不少人安裝完成後是這樣設置密碼的:(不推薦)
正確打開方式:mysql_secure_installation
若是容許root遠程登陸:Disallow root login remotely? [Y/n] n
安全初始化後登陸圖示:
以MariaDB 5.5.60
爲例:
/etc/my.cnf
--> /etc/mysql/conf.d/*.cnf
--> ~/.my.cnf
MariaDB安裝目錄/data/my.ini
PS:通常配置文件都會設置這3個
[mysqld] # 獨立表空間: 每個表都有一個.frm表描述文件,還有一個.ibd文件 innodb_file_per_table=on # 不對鏈接進行DNS解析(省時) skip_name_resolve=on # 配置sql_mode sql_mode='strict_trans_tables' # 指定數據庫文件存放路徑 # datadir=/mysql/data # socket=/mysql/data/mysql.sock # 與之對應
其餘配置MariaDB
提供了樣本:
[dnt@localhost ~] ls /usr/share/mysql/ | grep .cnf my-huge.cnf # 超大內存配置參考 my-innodb-heavy-4G.cnf # 4G內存配置參考 my-large.cnf # 大內存配置 my-medium.cnf # 中等內存配置 my-small.cnf # 小內存配置
PS:thread_concurrency
=CPU數*2
最佳,修改配置後記得重啓數據庫
1.以前安全初始化的時候把root
禁止遠程登陸了,如今咱們建立一個其餘用戶
2.給用戶權限
3.防火牆放行指定端口
4.遠程客戶端測試一下
Code以下:
# root帳戶登陸 mysql -uroot -p # 新增用戶 insert into mysql.user(user,host,password) values("用戶名","%",password("密碼")); # 刷新設置 flush privileges; # 分配權限 grant all privileges on 數據庫.* to 用戶名@"%" identified by "密碼"; # 刷新設置 flush privileges; # 顯示服務狀態 systemctl status firewalld # 添加 --permanent永久生效(沒有此參數重啓後失效) firewall-cmd --zone=public --add-port=3306/tcp --permanent # 從新載入 firewall-cmd --reload # 查看 firewall-cmd --zone= public --query-port=3306/tcp # 刪除 firewall-cmd --zone= public --remove-port=3306/tcp --permanent
SQLServer遠程鏈接:http://www.javashuo.com/article/p-wrzuikpx-dz.html
PS:先使用root建立數據庫,而後再受權grant all privileges on 數據庫.* to 用戶名@"%" identified by "密碼";
並刷新flush privileges;
查看權限:show grants for dnt;
效果:
以前有園友說,爲啥不順便說說UbuntuServer
的部署呢?呃。。。通常來講公司服務器都是CentOS
的佔大多數,而後UbuntuServer
更多的是我的雲服務比較多(推薦初創公司使用),畢竟它們兩個系統追求的不太同樣,一個是追求穩(部署麻煩),一個是追求軟件儘可能新的狀況下穩定(更新太快)
那麼長話短說,步入正軌:
Ubuntu不得不說的就是這個apt
出問題的處理 :(換源就不說了/etc/apt/sources.list
)
# 通常刪除這幾個鎖文件,而後再從新配置下就能夠了 sudo rm /var/lib/dpkg/lock sudo rm /var/lib/dpkg/lock-frontend sudo rm /var/lib/apt/lists/lock sudo rm /var/cache/apt/archives/lock # 簡寫(千萬注意空格,否則你就是rm -rf / + 跑路了) # sudo rm /var/lib/apt/lists/lock /var/cache/apt/archives/lock /var/lib/dpkg/lock /var/lib/dpkg/lock-frontend # 從新配置下 sudo dpkg --configure -a
Ubuntu
推薦使用MySQL
(畢竟同是5.x
用起來基本上差很少,安裝過程和以前說的CentOS 下 MariaDB
差很少,全部命令前加個sudo
)
1.安裝比較簡單:sudo apt install mysql-server -y
2.容許遠程鏈接:註釋掉 bind-address=127.0.0.1
(/etc/mysql/mysql.conf.d/mysqld.cnf
)
PS:經常使用配置(/etc/mysql/mysql.conf.d/mysqld.cnf
)
3.關於爲何是這個路徑的說明:sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
4.全部配置修改都須要從新啓動下:sudo systemctl restart mysql
5.第一次初始化和MariaDB不太同樣:sudo mysql_secure_installation
(其餘一路y
便可)
須要選下你設置root密碼的複雜度:(通常1就能夠了,就算設置再複雜,入了系統也是虛的)
PS:能夠看看拓展文章:Ubuntu16安裝mysql5.7未提示輸入密碼,安裝後修改mysql默認密碼 和 【不推薦】修改mysql密碼策略
6.而後輸入密碼你就能夠登陸了sudo mysql -uroot -p
(PS:你直接sudo mysql
也能夠直接登陸)
這邊我就不像上節課一步步演示了,直接受權和建立一步走了grant all privileges on 數據庫.* to "用戶名"@"%" identified by "複雜密碼";
7.記得flush privileges;
刷新一下系統表
MySQL5.7.26 忘記Root密碼小計:http://www.javashuo.com/article/p-heuahocu-cm.html
淺析MySQL 8忘記密碼處理方式 https://www.cnblogs.com/wangjiming/p/10363357.html MySQL5.6更改datadir數據存儲目錄 https://www.cnblogs.com/ding2016/p/7644675.html
CentOS7安裝MySQL8.0安裝小計:https://mp.weixin.qq.com/s/Su3Ivuy5IMeAwYBXaka0ag
文章結尾貼一節58
的MySQL
軍規:(適用於併發量大,數據量大的典型互聯網業務)
InnoDB
utf8
,必要時候使用utf8mb4
utf8
通用,無亂碼風險,漢字3字節,英文1字節utf8mb4
是utf8的超集
,存儲4字節時使用(eg:表情符號)2000
個之內1024
個之內unsigned
整數爲主鍵
update/delete
等SQL性能service
層,而且service
層不要經過join
來獲取主表和擴展表的屬性tinyint
/int
/bigint
,分別會佔用1
/4
/8
字節char
/varchar
(PS:沒有MSSQL裏的nvarchar
)
char
,可以減小碎片,查詢性能高varchar
,可以減小空間datetime
/timestamp
datetime
佔用5個字節,timestamp
佔用4個字節year
,存儲日期使用date
,存儲時間使用datetime
NOT NULL
並設默認值
int unsigned
存儲IPv4
,不要用char(15)
varchar(20)
存儲手機號,不要使用整數
varchar
能夠模糊查詢(eg:like ‘138%’)+、-、()
等字符,eg:+86
tinyint
來代替enum
enum
增長新值要進行DDL
操做uniq_字段名
來命名(uq_表名_字段名
)idx_字段名
來命名(ix_表名_字段名
)ES
等更爲適合的方式存儲生成執行計劃時,若是索引太多,會下降性能,並可能致使MySQL選擇不到最優索引
join
查詢,若是要進行join
查詢,被join
的字段必須類型相同,並創建索引
join
字段類型不一致容易致使全表掃描(a,b,c)
,至關於創建了(a)
, (a,b)
, (a,b,c)
select *
,只獲取必要字段
select *
會增長cpu/io/內存/帶寬
的消耗指定字段查詢,在表結構變動時,能保證對應用程序無影響
insert
必須指定字段,禁止使用insert into T values()
where
條件列使用函數或者表達式
%
開頭的模糊查詢
join
和子查詢
or
必須改寫爲in
,in
的值必須少於50個課後思考:爲何select uid from user where phone=13811223344
不能命中phone索引?
課後拓展:
MyISAM與InnoDB二者之間區別與選擇 https://www.cnblogs.com/y-rong/p/5309392.html https://www.cnblogs.com/y-rong/p/8110596.html 瞭解下Mysql的間隙鎖及產生的緣由 https://www.cnblogs.com/wt645631686/p/8324671.html grant受權和revoke回收權限 https://www.cnblogs.com/kevingrace/p/5719536.html centos7自帶數據庫MariaDB重啓和修改密碼 https://blog.csdn.net/shachao888/article/details/50341857 MySQL添加用戶、刪除用戶與受權 https://www.cnblogs.com/wanghetao/p/3806888.html 深度認識 Sharding-JDBC:作最輕量級的數據庫中間層 https://my.oschina.net/editorial-story/blog/888650