學了很多亂七雜八的東西,但是依然停留在前端,在工作中一直和后端交流,但是不太了解數據庫是怎么回事,為了加強學習,准備學習一些關於數據庫相關的東西。
說起數據庫可能會有很多很多,SQLServer
、Oracle
、Sybase
等等等,還有就是要學習MySql
,說了這么多數據庫這些都是關系型數據庫
。既然有關系型數據庫
自然也就會有非關系型數據
,比如Neo4j
、MongodDB
、Cloudant
等等等這些也就都屬於非關系型
數據庫,非關系型數據庫
又被稱為nosql
。
非關系型數據庫與關系型數據庫對比
# 非關系型數據庫
性能NOSQL
是基於鍵值對的,可以想象成表中的主鍵和值的對應關系,而且不需要經過SQL
層的解析,所以性能非常高。可擴展性同樣shouce也是因為基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。
優勢
nosql
數據庫簡單易部署,基本都是開源軟件,不需要像使用oracle
那樣花費大量成本購買使用,相比關系型數據庫價格便宜。nosql
數據庫將數據存儲於緩存之中,關系型數據庫將數據存儲在硬盤中,自然查詢速度遠不及nosql
數據庫。nosql
的存儲格式是key
,value
形式、文檔形式、圖片形式等等,所以可以存儲基礎類型以及對象或者是集合等各種格式,而數據庫則只支持基礎類型
。- 關系型數據庫有類似join這樣的多表查詢機制的限制導致擴展很艱難。
劣勢
- 維護的工具和資料有限,因為
nosql
是屬於新的技術,不能和關系型數據庫10幾年的技術同日而語。 - 不提供對
sql
的支持,如果不支持sql
這樣的工業標准,將產生一定用戶的學習和使用成本。 - 不提供關系型數據庫對事物的處理。
# 關系型數據庫
關系型數據庫對於復雜查詢可以用SQL
語句方便的在一個表以及多個表之間做非常復雜的數據查詢。事務支持使得對於安全性能很高的數據訪問要求得以實現。
優勢
- 保持數據的一致性(事務處理)
- 由於以標准化為前提,數據更新的開銷很小(相同的字段基本上都只有一處)
- 可以進行Join等復雜查詢
劣勢
- 大量數據的寫入處理
- 為有數據更新的表做索引或表結構(schema)變更
- 字段不固定時應用
- 對簡單查詢需要快速返回結果的處理
對於這兩類數據庫,對方的優勢就是自己的弱勢,反過來也是如此。
MySql安裝
在Windows
上安裝Mysql
還是比較簡單的,去Mysql
官網去現在zip
包就好了。下載完包之后把包解壓到想要存放的存儲盤內。
Mysql
有提供安裝版本,下載好之后安裝就能使用了,如果下載zip
包解壓后需要進行配置,比較麻煩,網上也有很多教程。
然后打開剛剛解壓的文件夾,在文件夾下面有一個my.ini
配置文件。
MySql
的配置與我們平時學習的語言不太一樣,MySql
在配置過程中有兩點需要注意:
- 配置中的
-
與_
是等價的 - 分段配置[******]隔離段
[mysql]
# 設置mysql客戶端默認字符集
default-character-set=utf8
[mysqld]
# 設置3306端口
port = 3306
# 設置mysql的安裝目錄
basedir=C:\\web\\mysql-8.0.11
# 設置 mysql數據庫的數據的存放目錄,MySQL 8+ 不需要以下配置,系統自己生成即可,否則有可能報錯
# datadir=C:\\web\\sqldata
# 允許最大連接數
max_connections=20
# 服務端使用的字符集默認為8比特編碼的latin1字符集
character-set-server=utf8
# 創建新表時將使用的默認存儲引擎
default-storage-engine=INNODB
根據以上內容更改配置就好了,並添加環境變量。這里安裝就不詳細介紹了。
MySql服務管理
MySQL
在服務中提供了一些對MySQL
管理的一些命令工具。
設置管理員密碼
./bin/mysqladmin -u root password "root123";
mysqladmin
是執行很多關於MySQL
的一些管理的工作,同樣也是在命令行里面去執行的。執行上面的命令,就會為root
用戶創建一個密碼。
啟動服務
./bin/mysqld_safe &
# ./bin/mysqld &
啟動服務的時候是使用mysqld_safe
這個命令的,實際上mysqld_safe
是一個腳本,他會管理mysqld
進程進行管理,一旦mysqld
因為異常導致程序崩潰的話mysqld_safe
會重啟一下MySQL
服務。
停止服務
./bin/mysqladmin shutdown
# kill -9 $mysqld_pid // 重啟服務
# kill $mysqld_pid
使用kill $mysqld_pid
命名會停止mysql服務,包括mysqld_safe
也會停止。
還有很多關於MySql
服務管理的命令,這里就不一一贅述了,單獨出一篇文章對其進一步介紹。
MySql可視化工具
安裝完數據庫之后需要安裝可視化工具,方便查看數據庫內容,以及方便創建數據庫和刪除數據數據庫等操作。
想要可視化MySQL
需要借助Nacicat
,網上有很多破解版可以隨便下載一個。Nacicat使用手冊。
下載安裝好之后可以與數據庫做連接,使用方法也很簡單。
MySql語法規范
MySql
數據庫屬於關聯型數據庫,需要使用Sql
語句對表數據進行查詢。一個數據庫通常包含一個或多個表。每個表由一個名字標識。表包含帶有數據的記錄(行)。Sql
語句對大小寫不敏感,但是還是建議所有的Sql
語句使用大寫,查詢條件與表名用小寫,這樣方便區分哪些是Sql
語句哪些是查詢條件。
在MySql
系統要求在每條 SQL 命令的末端使用分號。分號是在數據庫系統中分隔每條Sql
語句的標准方法,這樣就可以在對服務器的相同請求中執行一條以上的語句。
MySql數據類型
數值類型
整數型
類型 | 大小 | 范圍(有符號) | 范圍(無符號) | 用途 |
---|---|---|---|---|
TINYINT | 1 字節 | (-128,127) | (0,255) | 小整數值 |
SMALLINT | 2 字節 | (-32 768,32 767) | (0,65 535) | 大整數值 |
MEDIUMINT | 3 字節 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 |
INT或INTEGER | 4 字節 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
BIGINT | 8 字節 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數值 |
浮點型
類型 | 大小 | 范圍(有符號) | 范圍(無符號) | 用途 |
---|---|---|---|---|
FLOAT | 4 字節 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度,浮點數值 |
DOUBLE | 8 字節 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度,浮點數值 |
DECIMAL | 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 | 依賴於M和D的值 | 依賴於M和D的值 | 小數值 |
設一個字段定義為 float(5,3),如果插入一個數 123.45678,實際數據庫里存的是 123.457,但總個數還以實際為准,即 6 位。
日期和時間類型
注:每個時間類型有一個有效值范圍和一個"零"值,當指定不合法的MySQL不能表示的值時使用"零"值。
類型 | 大小 | 范圍 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 字節 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 字節 | '-838:59:59'/'838:59:59' | HH:MM:SS | 時間值或持續時間 |
YEAR | 1 字節 | 1901/2155 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
DATETIME | 8 字節 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
TIMESTAMP | 4 字節 | 1970-01-01 00:00:00/2038 結束時間是第 2147483647 秒,北京時間 2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
若定義一個字段為timestamp,這個字段里的時間數據會隨其他字段修改的時候自動刷新,所以這個數據類型的字段可以存放這條記錄最后被修改的時間。
字符串類型
類型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字節 | 定長字符串 |
VARCHAR | 0-65535 字節 | 變長字符串 |
TINYBLOB | 0-255字節 | 不超過 255 個字符的二進制字符串 |
TINYTEXT | 0-255字節 | 短文本字符串 |
BLOB | 0-65 535字節 | 二進制形式的長文本數據 |
TEXT | 0-65 535字節 | 長文本數據 |
MEDIUMBLOB | 0-16 777 215字節 | 二進制形式的中等長度文本數據 |
MEDIUMTEXT | 0-16 777 215字節 | 中等長度文本數據 |
LONGBLOB | 0-4 294 967 295字節 | 二進制形式的極大文本數據 |
LONGTEXT | 0-4 294 967 295字節 | 極大文本數據 |
char和varchar:
- char(n) 若存入字符數小於n,則以空格補於其后,查詢之時再將空格去掉。所以 char 類型存儲的字符串末尾不能有空格,varchar 不限於此。
- char(n) 固定長度,char(4) 不管是存入幾個字符,都將占用 4 個字節,varchar 是存入的實際字符數 +1 個字節(n<=255)或2個字節(n>255),所以 varchar(4),存入 3 個字符將占用 4 個字節。
- char 類型的字符串檢索速度要比 varchar 類型的快。
varchar 和 text:
- varchar 可指定 n,text 不能指定,內部存儲 varchar 是存入的實際字符數 +1 個字節(n<=255)或 2 個字節(n>255),text 是實際字符數 +2 個字節。
- text 類型不能有默認值。
- varchar 可直接創建索引,text 創建索引要指定前多少個字符。varchar 查詢速度快於 text, 在都創建索引的情況下,text 的索引似乎不起作用。
總結
MySql
數據關聯型數據庫,使用Sql
語句對數據庫進行操作。Sql
語句不區分大小寫,無論是關聯型數據庫還是非關聯型數據庫都各有優缺點。
在使用MySql
創建表時,需要多注意數據格式,會給數據庫查詢帶來一些性能的提升。
注:數據庫中如果使用大量索引,雖然查詢很快,但是會造成寫入過慢的情況,使用的時候要稍加慎重。