MySQL數據庫小結

1、基礎概念

1.1 數據

描述事物的符號記錄稱爲數據,描述事物的符號既能夠是數字,也能夠是文字、圖片,圖像、聲音、語言等,數據由多種表現形式,它們均可以通過數字化後存入計算機mysql

在計算機中描述一個事物,就須要抽取這一事物的典型特徵,組成一條記錄,就至關於文件裏的一行內容。sql

1.2 什麼是數據庫

數據庫即存放數據的倉庫,只不過這個倉庫是在計算機存儲設備上,並且數據是按必定的格式存放的數據庫

過去人們將數據存放在文件櫃裏,如今數據量龐大,已經再也不適用緩存

數據庫是長期存放在計算機內、有組織、可共享的數據便可。安全

數據庫中的數據按必定的數據模型組織、描述和儲存,具備較小的冗餘度、較高的數據獨立性和易擴展性,並可爲各類 用戶共享服務器

1.3 什麼是數據庫管理系統(DataBase Management System 簡稱DBMS)

在瞭解了Data與DB的概念後,如何科學地組織和存儲數據,如何高效獲取和維護數據成了關鍵併發

這就用到了一個系統軟件---數據庫管理系統oracle

如MySQL、Oracle、SQLite、Access、MS SQL Server性能

mysql主要用於大型門戶,例如搜狗、新浪等,它主要的優點就是開放源代碼,由於開放源代碼這個數據庫是免費的,他如今是甲骨文公司的產品。
oracle主要用於銀行、鐵路、飛機場等。該數據庫功能強大,軟件費用高。也是甲骨文公司的產品。
sql server是微軟公司的產品,主要應用於大中型企業,如聯想、方正等。操作系統

1.4 數據庫服務器、數據管理系統、數據庫、表與記錄的關係(重點理解)

記錄:1 Mark 324245234 22(多個字段的信息組成一條記錄,即文件中的一行內容)

表:student,scholl,class_list(即文件)

數據庫:oldboy_stu(即文件夾)

數據庫管理系統:如mysql(是一個軟件)

數據庫服務器:一臺計算機(對內存要求比較高)

1.5 小結

數據庫服務器:運行數據庫管理軟件

數據庫管理軟件:管理-數據庫

數據庫:即文件夾,用來組織文件/表

表:即文件,用來存放多行內容/多條記錄

2、基礎的SQL語句

2.1 簡介

SQL語言主要用於存取數據、查詢數據、更新數據和管理關係數據庫系統,SQL語言由IBM開發。SQL語言分爲3種類型:

  1. DDL語句 數據庫定義語言: 數據庫、表、視圖、索引、存儲過程,例如CREATE DROP ALTER
  2. DML語句 數據庫操縱語言: 插入數據INSERT、刪除數據DELETE、更新數據UPDATE、查詢數據SELECT
  3. DCL語句 數據庫控制語言: 例如控制用戶的訪問權限GRANT、REVOKE

2.2 SQL語句

操做文件夾
增:create database db1 charset utf8;
查:show databases;
改:alter database db1 charset latin1;
刪除: drop database db1;

操做文件
先切換到文件夾下:use db1
增:create table t1(id int,name char);
查:show tables
改:alter table t1 modify name char(3);
alter table t1 change name name1 char(2);
刪:drop table t1;

操做文件中的內容/記錄
增:insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3');
查:select * from t1;
改:update t1 set name='sb' where id=2;
刪:delete from t1 where id=1;

3、經常使用存儲引擎

3.1 數據庫存儲引擎

對於初學者來講咱們一般不關注存儲引擎,可是 MySQL 提供了多個存儲引擎,包括處理事務安全表的引擎和處理非事務安全表的引擎。在 MySQL 中,不須要在整個服務器中使用同一種存儲引擎,針對具體的要求,能夠對每個表使用不一樣的存儲引擎。

3.2 存儲引擎簡介

MySQL中的數據用各類不一樣的技術存儲在文件(或者內存)中。這些技術中的每一種技術都使用不一樣的存儲機制、索引技巧、鎖定水平而且最終提供普遍的不一樣的功能和能力。經過選擇不一樣的技術,你可以得到額外的速度或者功能,從而改善你的應用的總體功能。 存儲引擎說白了就是如何存儲數據、如何爲存儲的數據創建索引和如何更新、查詢數據等技術的實現方法。

例如,若是你在研究大量的臨時數據,你也許須要使用內存存儲引擎。內存存儲引擎可以在內存中存儲全部的表格數據。又或者,你也許須要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。

3.2.1 InnoDB

InnoDB是一個健壯的事務型存儲引擎,這種存儲引擎已經被不少互聯網公司使用,爲用戶操做很是大的數據存儲提供了一個強大的解決方案。個人電腦上安裝的 MySQL 5.6.13 版,InnoDB就是做爲默認的存儲引擎。InnoDB還引入了行級鎖定和外鍵約束,在如下場合下,使用InnoDB是最理想的選擇:

更新密集的表。InnoDB存儲引擎特別適合處理多重併發的更新請求。

事務。InnoDB存儲引擎是支持事務的標準MySQL存儲引擎。

自動災難恢復。與其它存儲引擎不一樣,InnoDB表可以自動從災難中恢復。

外鍵約束。MySQL支持外鍵的存儲引擎只有InnoDB。

支持自動增長列AUTO_INCREMENT屬性。

從 5.7 開始innodb存儲引擎成爲默認的存儲引擎。

通常來講,若是須要事務支持,而且有較高的併發讀取頻率,InnoDB是不錯的選擇。

3.2.2 MyISAM

MyISAM表是獨立於操做系統的,這說明能夠輕鬆地將其從Windows服務器移植到Linux服務器;每當咱們創建一個MyISAM引擎的表時,就會在本地磁盤上創建三個文件,文件名就是表名。例如,我創建了一個MyISAM引擎的tb_Demo表,那麼就會生成如下三個文件:

  • tb_demo.frm,存儲表定義。
  • tb_demo.MYD,存儲數據。
  • tb_demo.MYI,存儲索引。

MyISAM表沒法處理事務,這就意味着有事務處理需求的表,不能使用MyISAM存儲引擎。MyISAM存儲引擎特別適合在如下幾種狀況下使用:

選擇密集型的表。MyISAM存儲引擎在篩選大量數據時很是迅速,這是它最突出的優勢。

插入密集型的表。MyISAM的併發插入特性容許同時選擇和插入數據。例如:MyISAM存儲引擎很適合管理郵件或Web服務器日誌數據。

3.2.3 MRG_MYISAM

MRG_MyISAM存儲引擎是一組MyISAM表的組合,老版本叫 MERGE 實際上是一回事兒,這些MyISAM表結構必須徹底相同,儘管其使用不如其它引擎突出,可是在某些狀況下很是有用。說白了,Merge表就是幾個相同MyISAM表的聚合器;Merge表中並無數據,對Merge類型的表能夠進行查詢、更新、刪除操做,這些操做其實是對內部的MyISAM表進行操做。

Merge存儲引擎的使用場景。對於服務器日誌這種信息,通常經常使用的存儲策略是將數據分紅不少表,每一個名稱與特定的時間端相關。例如:能夠用12個相同的表來存儲服務器日誌數據,每一個表用對應各個月份的名字來命名。當有必要基於全部12個日誌表的數據來生成報表,這意味着須要編寫並更新多表查詢,以反映這些表中的信息。與其編寫這些可能出現錯誤的查詢,不如將這些表合併起來使用一條查詢,以後再刪除Merge表,而不影響原來的數據,刪除Merge表只是刪除Merge表的定義,對內部的表沒有任何影響。

ENGINE=MERGE,指明使用MERGE引擎,實際上是跟MRG_MyISAM一回事兒,也是對的,在MySQL ##已經看不到MERGE了。

UNION=(t1, t2),指明瞭MERGE表中掛接了些哪表,能夠經過alter table的方式修改UNION的值,以實現增刪MERGE表子表的功能。好比:alter table tb_merge engine=merge union(tb_log1) insert_method=last;INSERT_METHOD=LAST,INSERT_METHOD指明插入方式,取值能夠是:0 不容許插入;FIRST 插入到UNION中的第一個表; LAST 插入到UNION中的最後一個表。

MERGE表及構成MERGE數據表結構的各成員數據表必須具備徹底同樣的結構。每個成員數據表的數據列必須按照一樣的順序定義一樣的名字和類型,索引也必須按照一樣的順序和一樣的方式定義。

3.2.4 MEMORY

使用MySQL Memory存儲引擎的出發點是速度。爲獲得最快的響應時間,採用的邏輯存儲介質是系統內存。雖然在內存中存儲表數據確實會提供很高的性能,但當mysqld守護進程崩潰時,全部的Memory數據都會丟失。得到速度的同時也帶來了一些缺陷。它要求存儲在Memory數據表裏的數據使用的是長度不變的格式,這意味着不能使用BLOB和TEXT這樣的長度可變的數據類型,VARCHAR是一種長度可變的類型,但由於它在MySQL內部當作長度固定不變的CHAR類型,因此可使用。

通常在如下幾種狀況下使用Memory存儲引擎:

目標數據較小,並且被很是頻繁地訪問。在內存中存放數據,因此會形成內存的使用,能夠經過參數max_heap_table_size控制Memory表的大小,設置此參數,就能夠限制Memory表的最大大小。

若是數據是臨時的,並且要求必須當即可用,那麼就能夠存放在內存表中。

存儲在Memory表中的數據若是忽然丟失,不會對應用服務產生實質的負面影響。

Memory同時支持散列索引和B樹索引。B樹索引的優於散列索引的是,可使用部分查詢和通配查詢,也可使用<、>和>=等操做符方便數據挖掘。散列索引進行「相等比較」很是快,可是對「範圍比較」的速度就慢多了,所以散列索引值適合使用在=和<>的操做符中,不適合在 <或> 操做符中,也一樣不適合用在order by子句中。

3.2.5 CSV

CSV 存儲引擎是基於 CSV 格式文件存儲數據。

CSV 存儲引擎由於自身文件格式的緣由,全部列必須強制指定 NOT NULL 。

CSV 引擎也不支持索引,不支持分區。

CSV 存儲引擎也會包含一個存儲表結構的 .frm 文件,還會建立一個 .csv 存儲數據的文件,還會建立一個同名的元信息文件,該文件的擴展名爲 .CSM ,用來保存表的狀態及表中保存的數據量。

每一個數據行佔用一個文本行。

由於 csv 文件自己就能夠被Office等軟件直接編輯,保不齊就有不按規則出牌的狀況,若是出現csv 文件中的內容損壞了的狀況,也可使用 CHECK TABLE 或者 REPAIR TABLE 命令檢查和修復

3.2.6 ARCHIVE

Archive是歸檔的意思,在歸檔以後不少的高級功能就再也不支持了,僅僅支持最基本的插入和查詢兩種功能。在MySQL ##版之前,Archive是不支持索引,可是在MySQL ##之後的版本中就開始支持索引了。Archive擁有很好的壓縮機制,它使用zlib壓縮庫,在記錄被請求時會實時壓縮,因此它常常被用來當作倉庫使用。

3.2.7 BLACKHOLE

黑洞存儲引擎,全部插入的數據並不會保存,BLACKHOLE 引擎表永遠保持爲空,寫入的任何數據都會消失,

3.2.8 PERFORMANCE_SCHEMA

主要用於收集數據庫服務器性能參數。MySQL用戶是不能建立存儲引擎爲PERFORMANCE_SCHEMA的表,通常用於記錄binlog作複製的中繼。在這裏有官方的一些介紹MySQL Performance Schema

3.2.9 FEDERATED

主要用於訪問其它遠程MySQL服務器一個代理,它經過建立一個到遠程MySQL服務器的客戶端鏈接,並將查詢傳輸到遠程服務器執行,然後完成數據存取;在MariaDB的上實現是FederatedX

3.2.10 其餘

這裏列舉一些其它數據庫提供的存儲引擎,OQGraph、SphinxSE、TokuDB、Cassandra、CONNECT、SQUENCE。提供的名字僅供參考。

3.3 如何選擇合適的存儲引擎

提供幾個選擇標準,而後按照標準,選擇對應的存儲引擎便可,也能夠根據經常使用引擎對比來選擇你使用的存儲引擎。使用哪一種引擎須要根據需求靈活選擇,一個數據庫中多個表可使用不一樣的引擎以知足各類性能和實際需求。使用合適的存儲引擎,將會提升整個數據庫的性能。

  • 是否須要支持事務;
  • 是否須要使用熱備;
  • 崩潰恢復,可否接受崩潰;
  • 是否須要外鍵支持;
  • 存儲的限制;
  • 對索引和緩存的支持;

4、查詢中關鍵字的執行優先級

重點中的重點:關鍵字的執行優先級

  1. from:找到表
  2. where:拿着where指定的約束條件,去文件/表中取出一條條記錄
  3. group by:將取出的一條條記錄進行分組group by,若是沒有group by,則總體做爲一組
  4. select:執行select
  5. distinct:去重
  6. having:將分組的結果進行having過濾
  7. order by:將結果按條件排序:order by
  8. limit:限制結果的顯示條數
相關文章
相關標籤/搜索