MySQL數據庫系統

1、數據庫概述

  • 數據庫就是一個運行在系統上的軟件,用於存儲用戶我的信息、用戶的遊戲資料等;
  • 數據庫是多個表的集合,是存儲數據的倉庫,以必定的組織方式存儲的相互有關的數據
  • 數據庫由多個表組成,多個數據記錄組成一張表,相似Excel
  • 數據庫結構:由多個庫組成,一個庫包含多個表,一個表包含多條數據記錄(如文字、聲音、圖形)

2、數據庫分類

  • 關係型數據庫:創建在關係代數理論基礎上,數據結構使用簡單易懂的二維數據表,
    能夠用簡單的「實體-關係」(E-R)圖表示;E-R圖中包含實體(數據對象)、關係和屬性三個要素
  • 非關係型數據庫:也稱爲NoSQL(Not Only SQL),存儲數據不以關係模型爲依據,不須要固定的表格式

3、常見數據庫產品

  • Oracle:不開源的關係型數據庫。oracle產品,很好的支持TB級的數據、運行穩定、功能齊全、性能優異,安全機制好、價格昂貴,跨平臺支持。大型企業使用
  • DB2:不開源的關係型數據庫。IBM產品,最適用於海量數據,能知足中大型企業的需求,也能夠用於小中型電子商務系統,具備較好的可伸縮性、安全性和跨平臺支持
  • SQLServer:不開源的關係型數據庫。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等。

4、MySQL概述

  • MySQL是一個開源的關係型數據庫管理系統,由瑞典MySQL AB 公司開發,目前屬於Oracle旗下產品。MySQL
    是最流行的關係型數據庫管理系統之一,在 WEB 應用方面,MySQL是最好的 RDBMS(Relational Database
    Management System,關係數據庫管理系統) 應用軟件。
  • MySQL是一種關係數據庫管理系統,關係數據庫將數據保存在不一樣的表中,而不是將全部數據放在一個大倉庫內,這樣就增長了速度並提升了靈活性。
  • MySQL所使用的 SQL 語言是用於訪問數據庫的最經常使用標準化語言。MySQL軟件採用了雙受權政策,分爲社區版和商業版,因爲其體積小、速度快、整體擁有成本低,尤爲是開放源碼這一特色,通常中小型網站的開發都選擇MySQL 做爲網站數據庫。
  • 因爲其社區版的性能卓越,搭配PHP和Apache可組成良好的開發環境。

5、MySQL特性

1.使用 C和 C++編寫,並使用了多種編譯器進行測試,保證了源代碼的可移植性。mysql

2.支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操做系統。web

3.爲多種編程語言提供了 API。這些編程語言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和 Tcl 等。算法

4.支持多線程,充分利用 CPU 資源。sql

5.優化的 SQL查詢算法,有效地提升查詢速度。數據庫

6.既可以做爲一個單獨的應用程序應用在客戶端服務器網絡環境中,也可以做爲一個庫而嵌入到其餘的軟件中。編程

7.提供多語言支持,常見的編碼如中文的 GB 23十二、BIG5,日文的 Shift_JIS等均可以用做數據表名和數據列名。vim

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新增)

6、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

7、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只有在排序條件不是一個查詢條件表達式的狀況下才使用索引。(雖然如此,在涉及多個數據表查詢裏,即便有索引可用,那些索引在加快 ORDERBY 方面也沒什麼做用)。若是某個數據列裏包含許多重複的值,就算爲它創建了索引也不會有很好的效果。好比說,若是某個數據列裏包含的淨是些諸如「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 數據庫名.表名;

8、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; //因爲系統已經提交,故不能撤銷,

相關文章
相關標籤/搜索