目錄python
此數據庫系列,是學習工做中的總結,具體章節系列以下圖所示。若是您須要掃盲數據庫,突擊數據庫的面試,那就盤他,盤他!所謂初戀,初次見面,下凡數據庫基礎。請多多關照!mysql
查看近幾年的TIOBE發現了,一直在前十,可見是個老且管用的東西。面試
瞭解幾個術語:redis
DDL(Data Definition Language),定義數據庫對象。sql
DML:(DATA Manipulation Language),用來操做和數據庫相關記錄。數據庫
DCL:(Data Cnotrol Language)定義訪問權限和安全級別。緩存
DQL(Data Query Language)。查詢記錄。安全
sql大小寫規範服務器
表名、表別名、字段名、字段別名等能夠小寫網絡
SQL保留字,函數名,綁定變量大寫
SELECT name,age FROM student WHERE id="1";
咱們大部分的系統都會考慮到數據的存儲,那麼如何更有效地保存好數據,作好數據備份。當咱們擁有了數據,能夠進行數據挖掘,大數據分析,輿情預測,天然語言處理等等一系列的操做,可見存儲數據是多麼的重要。這一篇文章對數據庫基礎知識的掃盲,下一節將是數據存儲,數據備份等。另外我須要知道硬盤的處理速度比cpu,內存,網卡都會慢。
全稱 | 功能 | |
---|---|---|
DBMS | DataBase Management System | 可對多個數據庫進行管理 |
DB | DataBase | 存儲樹的集合,理解爲多個數據表 |
DBS | DataBase system | 老大哥。包含了數據庫管理系統和數據庫管理人員DBA |
Nosql的timestamp:
1970:Nosql=we have no sql
1980:Nosql=know sql
2000:Nosql=No SQL
2005:Nosql=not only sql
2013:Nosql=No,SQL
鍵值數據庫
經過key-value方式存儲,key爲惟一表示,優勢,查詢快,缺點是沒法像關係型數據庫同樣使用條件過濾,這樣可能致使遍歷全部的鍵,消耗大量的計算。因此常常用來做爲緩存,好比redis。
文檔數據庫
管理文檔,一個文檔至關於一條記錄,MongoDB。
搜索引擎
雖然關係型數據庫經常經過索引的方式提升檢索效率(不必定),可是對於全文檢索卻比較低。搜索引擎的優點好比Elasticsearch、Splunk和Solr採用全文搜索,核心原理爲倒排索引
列式數據庫
相對於行式數據庫,將數據按照列存儲,這樣能夠大量下降系統的IO(由於相鄰的數據類型同樣,方便壓縮,天然就會下降IO),適合分佈式文件系統,好比
圖數據庫
典型的就是網絡中的人與人的關係,節點和邊關係。
首先注意,mysql8.0以後已經放棄了這個功能(由於若是數據更新,緩存會狀況,若是爲動態數據常常更新,這樣反而增長SQL查詢時間)。緩存一般的理解是一箇中間層,若是在中間層存在查詢語句就直接返回,若是沒有則給解析器處理。
主要進行語法分析和語義分析。
肯定SQL語句的執行路徑。是根據全表檢索仍是根據索引。
進行權限檢查。
那麼mysql和oracle二者執行狀況有啥不同呢
MySql具備多種存儲引擎且能夠自定義存儲引擎,那麼有哪些存儲引擎,優勢缺點是啥?
描述 | |
---|---|
InnoDB | Mysql5.5之後默認存儲引擎,支持事務,行級鎖,外鍵約束 |
MyISAM | Mysql5.5之前爲默認存儲引擎,不支持事務和外鍵,最大特色速度快,佔資源少 |
Memory存儲引擎 | 使用系統內存爲存儲介質,更快的響應速度。 |
NDB存儲引擎 | 用於Mysql Cluster分佈式集羣環境 |
Archive存儲引擎 | 壓縮機制的特色便於文件的歸檔,經常使用來作倉庫 |
mysql> select @@profiling;若是爲0表明關閉,設置爲1表示打開。
mysql> select *from student;
show profiles;查看當前會話的profiles
建立公衆號原創做者數據庫
CREATE DATABASE WeChat_Official_Account_Author;
建立表 做者名(author_id,author_name且id爲遞增)
CREATE TABLE authors_name(author_id int(15) NOT NULL AUTO_INCREMENT),
author_name varchar(255) NOT NULL);
ALTER TABLE authors_name ADD(age int(12));
ALTER TABLE authors_name RENAME_COLUME age to author_age;
ALTER TABLE author_names DROP COLUME author_age;
不成規矩,不成方圓
惟一標識一條記錄,不重複且不能爲空(UNIQUE+NOT NULL)。主鍵可使是一個字段或者多個字段的組合,一個數據表主鍵只能有一個
外鍵確保表與表之間引用的完整性。外鍵能夠重複也能夠爲空。
字段在表中可使惟一的。
代表字段不該爲空,必須有取值。
檢查特定字段取值範圍的有效性
查詢單列
SELECT author_name FROM authors_name;
查詢全部列
SELECT * FROM authors_name;
SELECT DISTICT age FROM authors_name;
ASC 遞增排序,DESC遞減排序
SELECT author_name FROM authors_names ORDER BY age DESC;
返回5條數據 LIMIT須要放在最後
SELECT author_name FROM authors_names ORDER BY age DESC LIMIT 5;
關鍵字的順序:SELECT.....FROM...WHERE...GROUP BY
FROM>WHERE>GROUP BY HAVING>SELECT
當WHERE字句中同時出現OR和AND的時候,AND執行優先級會更高。通常來講()優先級最高,其次是AND,而後是OR。
通配符是對文本類型進行模糊哈訊,可是一般是全表掃描,因此效率很低。只有當LIKE後面沒有通配符,並對字段進行索引的時候不會進行全表掃描。匹配一部分特殊字符。"LIKE"操做符。
通配符匹配之任意字符串出現的任意次數(%)
通配符匹配之耽擱字符(_)
提供函數,相似接口,更方便快速的得出想要的結果。
描述 | 例子 | |
---|---|---|
ABS() | 取絕對值 | SELECT ABS(-5)---5 |
MOD() | 取餘 | SELECT MOD(101,3)---2 |
ROUND() | 四捨五入爲指定的小數位數,若是兩個參數,分別爲字段名稱和小數位數 | SELECT ROUND(38.29,1)--38.3 |
LENGTH() | 計算字段長度。一個漢字三個字符。 | SELECT LENGTH('小藍')--6 |
UPPER() | 字符轉大寫 | SELECT LOWER('qwe')--QWE |
LOWER() | 字符轉小寫 | SELECT LOWER('QWE')--qwe |
REPLACE() | 替換函數 | SELECT REPLACE('QWE123D','QWE',789)--789123D |
SUBSTRING() | 截取字符串 | SELECT SUBSTRING('QWE123',1,3)-- |
CHAR_LENGTH() | 計算機字段的長度,漢字,數字都算一個字符 | SELECT CHAR_LENGTH('小藍')--2 |
CONCAT() | 鏈接字符串 | SELECT CONCAT('XIAOLAN',789)---XIAOLAN789 |
DATA() | 返回時間的日期 | SELECT DATA('2020-03-13 11:30:20')--2020-03-13 |
YEAR()/MONTH()/DAY() | 返回時間的年份/月份/天數 | SELECT YEAR(NOW())--2020 |
HOUR() | 返回時間的小時 | SELECT hour('12:13:14')--12 |
MINUTE() | 返回時間的分鐘 | SELECT MINUTE('12:13:14')--13 |
SECOND() | 返回時間的秒部 | SELECT SECOND('12:13:14')--14 |
CURRENT_DATE() | 系統當前日期 | SELECT CURRENT_DATE('2020-03-13 11:30:20')--2020-03-13 |
CURRENT_TIME() | 系統當前時間,沒有具體日期 | SELECT CURRENT_TIME('2020-03-13 11:30:20')--11:30:20 |
CURRENT_TIMESTAMP() | 日期+時間 | SELECT CURRENT_TIMESTAMP--2020-03-13 11:30:20 |
描述 | 例子 | |
---|---|---|
COUNT() | 總行數,無論某個字段是否爲NULL | SELECT COUNT(*) FROM authors_name WHERE age>25 |
MAX() | 最大值 | SELECT MAX(Age) FROM authors_name |
MIN() | 最小值 | SELECT MIN(Age) FROM authors_name |
SUM() | 求和 | SELECT SUM(Age) FROM authors_name |
AVG() | 平均值 | SELECT AVG(Age) FROM authors_name |
使用GROUP BY字句進行數據分組。
WHERE 是用於數據行,而 HAVING 則做用於分組。若是分組完之後須要排序,就在其後增長ORDER BY完成
視圖能夠理解爲一箇中間表(結果集),咋們叫虛擬表,它主要把咱們常常查詢的結果存放於中,從而提高使用的效率。自己不具備數據。以下圖所示。
🍼重用SQL語句
🍼使用表的一部分而不是整個表
🍼更改數據格式和表示。
🍼經過授予表的特定訪問權限來保護數據,。。
✌️
要麼徹底執行,要麼不執行。
咱們知道當在高併發的狀況下,這個時候須要較高的吞吐量,那麼採起方式之一就是將原來的串行操做變化爲並行。這個時候能夠經過下降數據庫的隔離標準,來換取事務的併發能力。
講述相關內容以前,咱們先定義一個表以下。
ID | Age | Name |
---|---|---|
1 | 18 | 小藍 |
2 | 19 | 小林 |
3 | 20 | 小旋 |
小藍今天想去看看數據庫內容,並想把朋友小地增長到數據庫中,因而操做以下:
SQL> BEGINT: SQL> INSERT INTO authors value(4,20,"小地");
此時小藍尚未提交這個事務,小林去訪問了這個表(小林去年買了個表,哈哈哈嗝),因而
SQL>SELECT * FROM authors;
而後獲得這個結果:
ID | Age | Name |
---|---|---|
1 | 18 | 小藍 |
2 | 19 | 小林 |
3 | 22 | 小旋 |
4 | 20 | 小地 |
結論:小藍尚未提交事務,小林訪問卻看到了增長的小地,這就是髒讀。
小藍據說小地也在表裏,而後想看看是爲什麼人如此牛掰,幾歲了?
SQL> SELECT Age FROM authors where Name="小地"
結果以下:
Age |
---|
20 |
個人天,這麼年輕?小藍試圖用個事務去修改其年齡
SQL>BEGIN; SQL>UPDATE authors SET Age = 25 where Name='小地'
此時小藍去查詢下修改是否成功
SQL>SELECT Age FROM authors where Name='小地'
結果以下:
Age |
---|
25 |
牛掰,修改爲功?那麼問題來了,小藍雖然修改了,可是並無提交呀,這就是不可重複讀,兩次查詢出現了不一樣的結果。
今天小旋過來想看看,表裏都有哪些小夥伴。
SQL> SELECT *FROM authors;
結果以下:
ID | Age | Name |
---|---|---|
1 | 18 | 小藍 |
2 | 19 | 小林 |
3 | 22 | 小旋 |
4 | 20 | 小地 |
這個時候小林遇到個小妹妹,發現其文采還不錯,開啓個事務將其放入表中。
SQL> BEGIN; SQL> INSERT INTO authors values(5,'21','小魏')
小林記性太好了,因而還想看看到底有哪些人,
SQL> SELECT * FROM authors;
結果以下
ID | Age | Name |
---|---|---|
1 | 18 | 小藍 |
2 | 19 | 小林 |
3 | 22 | 小旋 |
4 | 20 | 小地 |
5 | 21 | 小魏 |
啊!小林驚呆了,怎麼多了個妹妹!!!這就是幻讀!
髒讀 | 不可重複讀 | 幻讀 | |
---|---|---|---|
讀未提交 | 容許 | 容許 | 容許 |
讀已提交 | 禁止 | 容許 | 容許 |
可重複讀 | 禁止 | 禁止 | 容許 |
可串行化 | 禁止 | 禁止 | 禁止 |
總結下:
讀未提交:
容許髒讀,也就是可能讀取到其餘會話中未提交事務修改的數據
讀已提交
只能讀取到已經提交的數據。Oracle等多數數據庫默認都是該級別 (不重複讀)
可重複讀
可重複讀。在同一個事務內的查詢都是事務開始時刻一致的,InnoDB默認級別。在SQL標準中,該隔離級別消除了不可重複讀,可是還存在幻讀
串行讀:
全串行化的讀,每次讀都須要得到表級共享鎖,讀寫相互都會阻塞.
爲何調優,無非就是但願響應更快,吞吐量更大,用戶體驗更好。
那麼怎麼得到反饋
他們是直接體驗者,來的直接。
經過性能工具進行查看,想起一張圖送給你們。
這裏是性能指標圖
通常從哪幾個方面着手數據庫調優,總之沒有最好,只有更合適。
好比須要有事務處理能力,能夠選擇mysql的InnoDB。若是採用若是考慮大幅度的下降系統IO,那麼能夠考慮Nosql中的列式數據庫,以前說過列式存儲方便使用壓縮,可是不適合頻繁的增刪改。
將常用的數據放入緩存中(內存),提高查詢效率。
主從架構優化讀寫策略,具體方法請關注系列篇第二節。
好了,上面的基礎部分學習應該差很少了,那麼數據庫相關的優化,主從架構,讀寫分離,數據庫的分片等都是怎麼樣的呢?盡請期待後續學習分享,一塊兒成長!
參考資料
《mysql必知必會》
《mysql45講》
https://blog.csdn.net/gengkui9897/article/details/89294936
《高性能mysql》