一、數據庫概述
- 數據庫就是一個運行在系統上的軟件,用於存儲用戶個人信息、用戶的遊戲資料等;
- 數據庫是多個表的集合,是存儲數據的倉庫,以一定的組織方式存儲的相互有關的數據
- 數據庫由多個表組成,多個數據記錄組成一張表,類似Excel
- 數據庫結構:由多個庫組成,一個庫包含多個表,一個表包含多條數據記錄(如文字、聲音、圖形)
二、數據庫分類
- 關係型數據庫:建立在關係代數理論基礎上,數據結構使用簡單易懂的二維數據表, 可以用簡單的“實體-關係”(E-R)圖表示;E-R圖中包含實體(數據對象)、關係和屬性三個要素
- 非關係型數據庫:也稱爲NoSQL(Not Only SQL),存儲數據不以關係模型爲依據,不需要固定的表格式
三、常見數據庫產品
- Oracle:不開源的關係型數據庫。oracle產品,很好的支持TB級的數據、運行穩定、功能齊全、性能優異,安全機制好、價格昂貴,跨平臺支持。大型企業使用
- DB2:不開源的關係型數據庫。IBM產品,最適用於海量數據,能滿足中大型企業的需求,也可以用於小中型電子商務系統,具有較好的可伸縮性、安全性和跨平臺支持
- SQL Server:不開源的關係型數據庫。Microsoft產品,功能全面的數據庫,只支持Microsoft操作系統。用於中大型企業,與其他數據庫相比,在操作性和交互性上有很大的優勢
- PostgreSQL:最具特色的開源數據庫,免費。有最全的數據類型支持,PostgreSQL支持大部分 SQL標準並且提供了許多其他現代特性:複雜查詢、外鍵、觸發器、視圖、事務完整性、MVCC。 可以使用多種方法擴展,如增加新的數據類型、函數、操作符、聚集函數、索引
- MySQL:開源的關係型數據庫。由瑞典MySQL AB 公司開發,目前被oracle公司收購,有體積小、速度快、性能出色、跨平臺支持、成本低廉、簡單易學、使用靈活等特性,很多中小型網站會選擇使用MySQL作爲數據庫
- MariaDB:MySQL在 008年被Sun以10億美金所收購,MySQL 創始人 Michael Widenius 則不滿 Sun開發團隊腳步過慢,憤而離職成立開源數據庫聯盟,另外從現有 MySQL 程序代碼中,開發出另一個延伸分支版本,也就是名爲瑪莉亞數據庫的企業級開源數據庫。
瑪莉亞數據庫如同 MySQL 的影子版本,瑪莉亞數據庫是 MySQL 的一個分支版本(branch),而不是衍生版本(folk),提供的功能可和 MySQL 完全兼容。 - NoSQL:NoSQL(NoSQL = Not Only SQL),意即“不僅僅是 SQL”,是一項全新的數據庫革命性運動。NoSQL指的是非關係型的數據庫。隨着互聯網 web2.0網站的興起,傳統的關係數據庫在應付 web2.0 網站,特別是超大規模和高併發的 SNS 類型的 web2.0 純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關係型的數據庫則由於其本身的特點得到了非常迅速的發展。
其代表的開源軟件如:Membase、MongoDB、Hypertable、Apache Cassandra、CouchDB等。
四、MySQL概述
- MySQL是一個開源的關係型數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬於Oracle旗下產品。MySQL 是最流行的關係型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS(Relational Database Management System,關係數據庫管理系統) 應用軟件。
- MySQL是一種關係數據庫管理系統,關係數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。
- MySQL所使用的 SQL 語言是用於訪問數據庫的最常用標準化語言。MySQL 軟件採用了雙授權政策,分爲社區版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇 MySQL 作爲網站數據庫。
- 由於其社區版的性能卓越,搭配PHP和Apache可組成良好的開發環境。
五、MySQL特性
1.使用 C和 C++編寫,並使用了多種編譯器進行測試,保證了源代碼的可移植性。
2.支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操作系統。
3.爲多種編程語言提供了 API。這些編程語言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和 Tcl 等。
4.支持多線程,充分利用 CPU 資源。
5.優化的 SQL查詢算法,有效地提高查詢速度。
6.既能夠作爲一個單獨的應用程序應用在客戶端服務器網絡環境中,也能夠作爲一個庫而嵌入到其他的軟件中。
7.提供多語言支持,常見的編碼如中文的 GB 2312、BIG5,日文的 Shift_JIS等都可以用作數據表名和數據列名。
8.提供 TCP/IP、ODBC 和 JDBC等多種數據庫連接途徑。
9.提供用於管理、檢查、優化數據庫操作的管理工具。
10.支持大型的數據庫。可以處理擁有上千萬條記錄的大型數據庫。
11.支持多種存儲引擎。
12.MySQL 是開源的,所以你不需要支付額外的費用。
13.MySQL 使用標準的 SQL數據語言形式。
14.MySQL 對 PHP 有很好的支持,PHP是比較流行的 Web 開發語言。
15.MySQL是可以定製的,採用了 GPL協議,你可以修改源碼來開發自己的 MySQL 系統。
16.在線 DDL/更改功能,數據架構支持動態應用程序和開發人員靈活性(5.6新增)
17.複製全局事務標識,可支持自我修復式集羣(5.6新增)
18.複製無崩潰從機,可提高可用性(5.6新增)
19.複製多線程從機,可提高性能(5.6新增)
20.3倍更快的性能(5.7 新增)
21.新的優化器(5.7新增)
22.原生JSON支持(5.7新增)
23.多源複製(5.7新增)
24.GIS的空間擴展 (5.7新增)
六、MySQL存儲引擎
一種存儲機制、根據不同的引擎實現不同的功能,以及不同的性能
1.存儲引擎分類
- MyISAM:MySQL 5.0 之前的默認數據庫引擎,最爲常用。擁有較高的插入,查詢速度,但不支持事務。表級鎖定:數據更新時會鎖定整張表。佔用資源少,性能高。寫入性能弱
-
InnoDB:事務型數據庫的首選引擎,支持ACID事務,支持行級鎖定, MySQL 5.5 起成爲默認數據庫引擎。與MyISAM相比有更好的緩存支持,支持表空間、表分區、佔用硬件資源較高。
- BDB:源自 Berkeley DB,事務型數據庫的另一種選擇,支持Commit 和Rollback 等其他事務特性
- Memory:所有數據置於內存的存儲引擎,擁有極高的插入,更新和查詢效率。但是會佔用和數據量成正比的內存空間。並且其內容會在 MySQL 重新啓動時丟失
- Merge:將一定數量的 MyISAM 表聯合而成一個整體,在超大規模數據存儲時很有用
- Archive:非常適合存儲大量的獨立的,作爲歷史記錄的數據。因爲它們不經常被讀取。Archive 擁有高效的插入速度,但其對查詢的支持相對較差
- Federated:將不同的 MySQL 服務器聯合起來,邏輯上組成一個完整的數據庫。非常適合分佈式應用
- Cluster/NDB:高冗餘的存儲引擎,用多臺數據機器聯合提供服務以提高整體性能和安全性。適合數據量大,安全和性能要求高的應用
- CSV: 邏輯上由逗號分割數據的存儲引擎。它會在數據庫子目錄裏爲每個數據表創建一個 .csv 文件。這是一種普通文本文件,每個數據行佔用一個文本行。CSV 存儲引擎不支持索引。
- BlackHole:黑洞引擎,寫入的任何數據都會消失,一般用於記錄 binlog 做複製的中繼
- EXAMPLE 存儲引擎是一個不做任何事情的存根引擎。它的目的是作爲 MySQL 源代碼中的一個例子,用來演示如何開始編寫一個新存儲引擎。同樣,它的主要興趣是對開發者。EXAMPLE 存儲引擎不支持編索引。
另外,MySQL 的存儲引擎接口定義良好。有興趣的開發者可以通過閱讀文檔編寫自己的存儲引擎 。
2.引擎操作
(1)查看
mysql> show engines; //查看當前數據庫所有支持的存儲引擎
mysql> show table status from 庫名 where name='表名'\G; //查看指定表的狀態信息,可查看錶使用的存儲引擎
mysql> show create table 表名\G; //查看創建表時的結構,也可查看錶創建時指定的存儲引擎
(2)更改
(2.1)更改默認存儲引擎(下次創建表時生效,以前表存儲引擎不會更改)
vim /etc/my.cnf
[mysqld]
default-storage-engine=引擎
/etc/init.d/mysqld restart
mysql -u root -p
mysql> show engines; //驗證是否更改
(2.2)更改現有表的存儲引擎
mysql> alter table 表名 engine=引擎; //將指定表更改爲指定的存儲引擎
(2.3)創建表時指定存儲引擎
mysql> create table 表名 字段 engine=引擎; //創建使用指定引擎的表
(2.4)批量將指定庫下所有表的InnoDB改爲MyISAM
yum -y install perl-DBD-MySQL //安裝命令所需的軟件包
mysql_convert_table_format --user=用戶名 --password='密碼' --socket=/tmp/mysql.sock --type=MyISAM 數據庫名 //更改指定庫下的所有表的存儲引擎;適用於源碼
mysql_convert_table_format --user=用戶名 --password='密碼' --socket=/var/lib/mysql/mysql.sock --type=MyISAM 數據庫名 //更改指定庫下的所有表的存儲引擎;適用於RPM或YUM
注:mysql_convert_table_format命令只能從InnoDB引擎更改爲MyISAM
七、MySQL索引功能
1.索引的作用
- 大大大加快數據的檢索速度和增加查詢的效率
- 降低磁盤I/O成本
- 保證數據記錄的唯一性
- 使得應用於表的SQL語句執行的更快
2.索引簡述
- 在關係數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
- 索引是一種特殊的文件(InnoDB 數據表上的索引是表空間的一個組成部分),它們包含着對數據表裏所有記錄的引用指針。索引不是萬能的,索引可以加快數據檢索操作,但會使數據修改操作變慢。每修改數據記錄,索引就必須刷新一次。爲了在某種程度上彌補這一缺陷,許多 SQL 命令都有一個 DELAY_KEY_WRITE 項。這個選項的作用是暫時制止 MySQL 在該命令每插入一條新記錄和每修改一條現有之後立刻對索引進行刷新,對索引的刷新將等到全部記錄插入/修改完畢之後再進行。在需要把許多新記錄插入某個數據表的場合,DELAY_KEY_WRITE 選項的作用將非常明顯。另外,索引還會在硬盤上佔用相當大的空間。因此應該只爲最經常查詢和最經常排序的數據列建立索引。注意,如果某個數據列包含許多重複的內容,爲它建立索引就沒有太大的實際效果。
- 從理論上講,完全可以爲數據表裏的每個字段分別建一個索引,但 MySQL 把同一個數據表裏的索引總數限制爲16個。
InnoDB 數據表的索引
- 在 InnoDB 數據表上,索引對 InnoDB 數據表的重要性要大得多。在 InnoDB 數據表上,索引不僅會在搜索數據記錄時發揮作用,還是數據行級鎖定機制的苊、基礎。“數據行級鎖定”的意思是指在事務操作的執行過程中鎖定正在被處理的個別記錄,不讓其他用戶進行訪問。這種鎖定將影響到(但不限於)SELECT、LOCKINSHAREMODE、SELECT、FORUPDATE 命令以及 INSERT、UPDATE 和 DELETE 命令。出於效率方面的考慮,InnoDB 數據表的數據行級鎖定實際發生在它們的索引上,而不是數據表自身上。顯然,數據行級鎖定機制只有在有關的數據表有一個合適的索引可供鎖定的時候才能發揮效力。
3.索引的限制
- 如果 WHERE 子句的查詢條件裏有不等號(WHERE coloum !=),MySQL 將無法使用索引。類似地,如果 WHERE 子句的查詢條件裏使用了函數(WHERE DAY(column)=),MySQL 也將無法使用索引。在 JOIN 操作中(需要從多個數據表提取數據時),MySQL 只有在主鍵和外鍵的數據類型相同時才能使用索引。
- 如果 WHERE 子句的查詢條件裏使用比較操作符 LIKE 和 REGEXP,MySQL 只有在搜索模板的第一個字符不是通配符的情況下才能使用索引。比如說,如果查詢條件是 LIKE 'abc%‘,MySQL 將使用索引;如果查詢條件是 LIKE '%abc’,MySQL 將不使用索引。
- 在 ORDER BY 操作中,MySQL 只有在排序條件不是一個查詢條件表達式的情況下才使用索引。(雖然如此,在涉及多個數據表查詢裏,即使有索引可用,那些索引在加快 ORDER BY 方面也沒什麼作用)。如果某個數據列裏包含許多重複的值,就算爲它建立了索引也不會有很好的效果。比如說,如果某個數據列裏包含的淨是些諸如 “0/1” 或 “Y/N” 等值,就沒有必要爲它創建一個索引。
4.索引的分類
(1)普通索引
- 最基本的索引類型,沒有唯一性之類的限制。
(2)唯一索引
-
唯一索引是不允許其中任何兩行具有相同索引值的索引。
-
當現有數據中存在重複的鍵值時,大多數數據庫不允許將新創建的唯一索引與表一起保存。數據庫還可能防止添加將在表中創建重複鍵值的新數據。例如,如果在 employee 表中職員的姓 (lname) 上創建了唯一索引,則任何兩個員工都不能同姓。
- 對某個列建立UNIQUE索引後,插入新紀錄時,數據庫管理系統會自動檢查新紀錄在該列上是否取了重複值,在CREATE TABLE 命令中的UNIQE約束將隱式創建UNIQUE索引。
(3)主鍵索引
-
簡稱爲主索引,數據庫表中一列或列組合(字段)的值唯一標識表中的每一行。該列稱爲表的主鍵。
-
在數據庫關係圖中爲表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數據的快速訪問。
- 提示儘管唯一索引有助於定位信息,但爲獲得最佳性能結果,建議改用主鍵索引。
(4)候選索引
- 與主索引一樣要求字段值的唯一性,並決定了處理記錄的順序。在數據庫和自由表中,可以爲每個表建立多個候選索引。
(5)複合索引
- 兩個或更多個列上的索引被稱作複合索引。 利用索引中的附加列,您可以縮小搜索的範圍,但使用一個具有兩列的索引不同於使用兩個單獨的索引。 不允許數據記錄出現重複值和空值。
(6)全文索引
-
全文索引是目前實現大數據搜索的關鍵技術。 能夠利用分詞技術等多種算法智能分析出文本文字中關鍵字詞的頻率及重要性,然後按照一定的算法規則智能地篩選出我們想要的搜索結果。 用於多個列值,允許數據記錄出現重複值和空值
- MySQL自帶的全文索引只能用於數據庫引擎爲MyISAM的數據表
(7)空間索引
- 在MySQL 5.7.4實驗室版本中, InnoDB存儲引擎新增了對於幾何數據空間索引的支持。在此之前,InnoDB將幾何數據存儲爲BLOB(二進制大對象)數據,在空間數據上只能創建前綴索引,當涉及空間搜索時非常低效,尤其是在涉及複雜的幾何數據時。在大多數情況下,獲得結果的唯一方式是掃描表。 新版本MySQL中,InnoDB支持空間索引,通過R樹來實現,使得空間搜索變得高效。
5.索引的使用
(1)創建索引
create [unique | fulltext | spatial] index 索引名 on 表名(字段)
詳解
unique:唯一索引
fulltext:全文索引,InnoDB不支持FULLTEXT類型的索引
spatial:空間索引
案例
mysql> create index hehe_1 on hehe.user(user_name); //user表中user_name字段新建普通索引
mysql> create unique index hehe_2 on hehe.user(user_passwd); //user表中user_passwd字段新建唯一索引
mysql> create index hehe_3 on hehe.user(user_name,user_passwd);
//user表中user_name、user_passwd字段組合爲複合索引
(2)查看索引
show index from 數據庫名.表名;
(3)刪除索引
drop index 索引名 on 數據庫名.表名;
八、MySQL事務功能
1.事務簡述
一個事務是一個連續的一組數據庫操作,就好像它是一個單一的工作單元進行。換言之,永遠不會是完整的事務,除非該組內的每個單獨的操作是成功的。如果在事務的任何操作失敗,則整個事務將失敗。
2.事務特性
- 原子性:在事務的操縱中,要麼都執行、要麼都不執行
- 一致性:事務中,保證數據從一個一致狀態變爲另一一致狀態
- 隔離性:每個事務互不干擾,一起執行也可
- 持久性:事務提交後,數據的影響是永久性的
3.事務使用
(1)自動提交
mysql> set autocommit=1; //開啓事務自動提交,set autocommit=0禁止自動提交
(2)手動提交
mysql> begin; //事務開始聲明
mysql> SQL語句...; //執行的SQL語句
mysql> rollback; //回滾事務
mysql> commit; //提交事務
注:回滾只能回滾當前事務提交之前操縱,所有當前事務提交成功的全部失效
(3)自動回滾的情況
- begin後手動退出數據庫(如Ctrl+C、quit、exit)
- 服務器斷電
(4)例子:轉賬
1.給對方轉賬1000,帳號不對
2.輸入轉入金額
3.提交確認
begin;
create database hehe;
create table hehe.a(number int,user char(4),menony int(4));
insert into hehe.a values ('1','a','1000');
insert into hehe.a values ('2','b','10');
commit; //正常提交
事務操作
begin; //開始
update hehe.a set menony='0' where user='a';
rollback; //回滾操作
begin;
update hehe.a set menony='0' where user='a';
update hehe.a set menony='1010' where user='b';
commit; //提交
rollback; //由於系統已經提交,故不能撤銷,