程序時由指令+數據所組成的,當我們要開發一個程序或是調用一個程序時,程序一般是寫在程序文件中的,然而,數據的存儲方式則就有多種了,包括:變量、數組、文件、存儲工具。
文件名:文件名就是引用磁盤存儲空間上一段數據流的一個標記
數據庫其實就是數據存儲管理系統,它一般爲用戶提供兩中接口,一種是編程接口(API),這是一種爲程序員所準備的接口,程序可以根據API開發所需要的程序;另外一種就是交互式接口,這種接口面向的是一般的普通用戶,他們
沒有編程經驗,但是,可以通過程序員開發好的程序,對數據進行操作。
某種情況下,數據庫的查詢比文件查詢某項內容時,效率要高很多,這是由於,數據庫中有索引,它不需要去遍歷數據庫中的每一項內容,有人會說,索引越多,那效率不是越高嗎?但是結果並不是這樣的,物極必反就是這個道理,過多的索引,在添加數據時,在關係型數據庫中,就要創建相應的索引,這樣,對寫入數據是有損壞的。所以,所以要適量。
下面,介紹一下關係型數據庫中的代表MySQL的相關特性:
MySQL數據庫中有約束的概念,用戶填入的數據只能在指定的範圍內進行變化
候選鍵:可以被用於MySQL數據庫的主鍵
惟一鍵與主鍵的區別:惟一鍵可以爲空,主鍵不能爲空
數據庫管理系統(DBMS)的主要優點如下:
它的數據具有獨立性;
對於用戶的數據存取的效率是高效的;
保證了數據的完整性和安全性,安全性體現在要對用戶進行驗證;
能對數據進行很好的管理操作;
對併發的數據存儲性好,有着良好的故障恢復;
MySQL數據庫簡單易學,開發週期較短;
對於不用的客戶請求,MySQL的多個線程發起響應,若是同時寫入一個文件時,會損壞文件嗎?
答案是:不會的,MySQL和文件一個,也有鎖的概念,當一個用戶訪問某個文件時,相應的就會加鎖,但是,MySQL的鎖和文件的鎖不是一個概念,MySQL的鎖是基於行級別上的,當用戶請求的是同一張表時,但是,不是同一行,就能同時進行操作,並不相互影響,這樣,也就處理大併發量的狀況。
MySQL中用戶存入數據的大概過程:
計劃執行器:爲用戶的請求生成執行計劃
分析器:分析用戶的sql語句是否能夠執行,做語法、詞法的分析,判斷命令的格式
操作求解器:做一次完整操作,選擇一種一種操作路徑
優化器:選擇最優的執行方式
事務管理器:
事務:把多個事務當做一個整體來操作,讀寫可以同時進行
鎖管理器:併發的控制工具
文件和存儲接口:存取和讀取文件時的接口
緩衝管理器:緩衝文件數據
磁盤空間管理器:與磁盤上的文件進行交互
恢復管理器:恢復數據
MariaDB:
與MySQL相比,新的特性
存儲引擎方面:
Aria:新一代的MyISAM,增強版,崩潰後能夠自己修復
XtraDB:替代InnoDB這個存儲引擎
FederatedX:跨平臺的存儲引擎
OQGRAPTH:圖庫,存儲圖示數據,5.5被禁用
SphinxSE:全文搜索引擎,構建出全文索引,並搜索
TokuDB:特別使用於存儲海量數據
Cassandra:非關係型數據庫,智能化的故障轉移,沒有中心節點,可以橫向擴展
Hadoop比Cassandra更優秀
MySQL的特性:
運行速度快,MySQL是完全多線程
MySQL支持查詢緩存,在衆多的關係型數據庫中較好
MySQL的可靠性好
MySQL支持橫向擴展,伸縮性好
MySQL簡單易用,對初學者沒有太高的門檻
MySQL具有較好的移植能力,支持多平臺,而且兼容
支持多用戶,
支持的字符集多,國際化
較好的應用支持,例如python,java,c等
是一款開源軟件
MySQL分爲企業版和社區版,社區版不提供任何服務
MySQL embedded server :MySQL的嵌入式服務器
MySQL服務器端組件剖析:
onnectors:MySQL的各種前端應用,包括native c API,JDBC,python ,php等
connection pool:連接池,把MySQL的各種連接請求發送到MySQL線程上進行處理
負責實現:
用戶的認證
線程回收重用
連接限制
內存檢查
提供緩存
MySQL的核心組件:
connection pool:連接池,實現認證、線程重用、連接限制、內存檢查、緩存
SQL interface:SQL接口,提供DML和DDL語句,關係型數據庫的基本抽象
parser:分析器,實現查詢轉換,對象權限獲取,查詢翻譯SQL語句
optimizer:優化器,SQL的分析結束後,會生成訪問路徑,優化器會從衆根據MySQL的
此前的統計數據,來從中選擇一條的最優的,開銷最小的路徑
cache && buffer:緩存和緩衝,用於提升MySQL的I/O方面數據性能表現
插件式的存儲引擎:
MyISAM:
InnoDB:(XtraDB:二次發行版)
memory:
文件和日誌
管理服務類的工具箱 :admin tools
備份恢復接口
安全
複製
集羣
管理
配置
移植
元數據管理
存儲引擎是表級別的概念,同一個庫中的表可以使用不同的存儲引擎,但是,建議使用相同的存儲引擎
由於MariaDB和MySQL的區別性不大,我們這裏採用MariaDB的安裝方式:
安裝MariaDB的方式如下:
1、rpm包安裝
系統提供商提供的包
MySQL官方提供的
2、通用二進制格式
3、源代碼編譯安裝
準備工作:
首先,我們爲我們的數據庫提供一個單獨存放數據的空間,這裏,我們採用另一塊硬盤,且,硬盤採用邏輯卷的形式分區,然後掛載至/mysql目錄下
1、將額外的硬盤創建一個分區,且分區標識爲邏輯卷
Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) [root@localhost ~]# fdisk -l /dev/sdb Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x5f5ef245 Device Boot Start End Blocks Id System /dev/sdb1 1 2610 20964793+ 8e Linux LVM
2、將分區進行格式化,掛載到/mysql目錄下(要求開機自動掛載),要事先創建此目錄
[root@localhost ~]# mkdir /mysql [root@localhost ~]# mke2fs -t ext4 -b 2048 -m 3 -L mysql /dev/sdb1
文件系統爲ext4,塊大小爲2048,預留空間百分比爲3%,卷標爲mysql
[root@localhost ~]# vim /etc/fstab LABEL=mysql /mysql ext4 defaults 0 0
以卷標的形式掛載
將fstab下的文件系統掛載
[root@localhost ~]# mount -a
使用源代碼編譯MySQL
指定安裝文件的安裝路徑時,常用的選項
-DMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc
編譯時,默認編譯的存儲引擎有:csv、myisam、myisammrg和heap,指定其他引擎
,必須要手動指定
-DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_FEDERATER_STORAGE_ENGINE=1
假設,上面默認的存儲引擎,不想用了,可以使用如下選項
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 -DWITHOUT_FEDERATED_STORAGE_ENGINE=1 -DWITHOUT_PARTITION_STORAGE_ENGINE=1
如果要編譯其他功能,要使用如下語句指定使用某庫或不使用某庫
-DWITH-READLINE=1 -DWITH-SSL=system #使用系統自帶的系統加密庫 -DWITH-ZLIB=system -DWITH-LIBWRAP=0
其他常用選項
-DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DEABLED_LOCAL_INFILE=1 #啓用本地的infile功能 -DEXTRA_CHARSETS=all #額外使用的字符集 -DDEFAULT_CHARSET=utf8 #默認的字符集爲utf8 -DDEFAULT_COLLATION=utf8_general_ci #默認的排序規則 -DWITH_DEBUG=0 #不啓用debug的功能 -DENABLE_PROFILING=1 #啓用性能剖析功能
首先,我們要讓服務運行在一個普通用戶下面,創建mysql用戶
[root@localhost ~]# groupadd -r mysql [root@localhost ~]# useradd -g mysql -r mysql [root@localhost ~]# chown mysql:mysql /mysql/
將上面創建的分區的屬組改爲mysql用戶和組
開啓編譯安裝MariaDB數據庫
先編譯安裝cmake工具
[root@localhost src]# tar zxf cmake-3.0.1.tar.gz [root@localhost src]# cd cmake-3.0.1 [root@localhost cmake-3.0.1]# ./bootstrap [root@localhost cmake-3.0.1]# make && make install
編譯安裝MariaDB數據庫
[root@localhost src]# tar zxf mariadb-10.0.12.tar.gz [root@localhost src]# cd mariadb-10.0.12 [root@localhost mariadb-10.0.12]# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/mysql/ -DSYSCONFDIR=/etc/ -DWITH-INNOBASE_STORAGE_ENGINE=1 -DWITH-ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci [root@localhost mariadb-10.0.12]# make -j 4
#如果CPU比較空閒時,建議使用多核心編譯,加快編譯速遞
[root@localhost mariadb-10.0.12]# make install
如果中間報錯,應該是由於ssl的開發包和zlib的開發包沒有安裝
[root@localhost ~]# yum install openssl-devel [root@localhost ~]# yum install zlib-devel
如果想清理此前編譯所生成的文件,使用下面的使用命令
rm CMAKECache.txt
爲MariaDB提供服務啓動腳本,並賦予執行權限:
[root@localhost mariadb-10.0.12]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld [root@localhost mariadb-10.0.12]# chmod +x /etc/rc.d/init.d/mysqld
爲MariaDB提供配置文件,具體要看服務器的內存大小來選擇
[root@localhost mariadb-10.0.12]# cp support-files/my-large.cnf /etc/my.cnf
更改配置文件,將上面的邏輯分區作爲MariaDB數據的存放目錄
[root@localhost mariadb-10.0.12]# vim /etc/my.cnf datadir = /mysql
初始化MariaDB數據庫
[root@localhost mysql]# ./scripts/mysql_install_db –user=mysql –datadir=/mysql/
爲MariaDB的命令都加入到PATH環境變量中去
[root@localhost ~]#vim /etc/profile.d/mysql.sh export PATH=/usr/local/mysql/bin:$PATH [root@localhost ~]#source /etc/profile.d/mysql.sh #重讀一下此文件
啓動MariaDB服務,並登錄
[root@localhost mysql]# service mysqld start Starting MySQL. [ OK ] [root@localhost mysql]# mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 4 Server version: 10.0.12-MariaDB-log Source distribution Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>
到此,編代碼編譯MariaDB就成功了