數據庫整理文檔

數據庫整體文檔

MySQL

1.SQL 的 select 語句完整的執行順序

SQL Select 語句完整的執行順序:1from 子句組裝來自不同數據源的數據;
2where 子句基於指定的條件對記錄行進行篩選;
3group by 子句將數據劃分爲多個分組;
4、使用聚集函數進行計算;
5、使用 having 子句篩選分組;
6、計算所有的表達式;
7select 的字段;
8、使用 order by 對結果集進行排序。
SQL 語言不同於其他編程語言的最明顯特徵是處理代碼的順序。在大多數據庫語言中,代碼按編碼順序被處理。但在 SQL 語句中,第一個被處理的子句式 FROM,而不是第一齣現的SELECT.

2.Mysql 數據庫存儲的原理

儲存過程是一個可編程的函數,它在數據庫中創建並保存。它可以有 SQL 語句和一些特殊的控制結
構組成。當希望在不同的應用程序或平臺上執行相同的函數,或者封裝特定功能時,存儲過程是非常有
用的。數據庫中的存儲過程可以看做是對編程中面向對象方法的模擬。它允許控制數據的訪問方式。存
儲過程通常有以下優點:
1、存儲過程能實現較快的執行速度
2、存儲過程允許標準組件是編程。
3、存儲過程可以用流程控制語句編寫,有很強的靈活性,可以完成複雜的判斷和較複雜的運算。
4、存儲過程可被作爲一種安全機制來充分利用。
5、存儲過程能夠減少網絡流量

3.事務的特性

1、原子性(Atomicity):事務中的全部操作在數據庫中是不可分割的,要麼全部完成,要麼均不執行。
2、一致性(Consistency):幾個並行執行的事務,其執行結果必須與按某一順序串行執行的結果相一致。
3、隔離性(Isolation):事務的執行不受其他事務的干擾,事務執行的中間結果對其他事務必須是透明的。
4、持久性(Durability):對於任意已提交事務,系統必須保證該事務對數據庫的改變不被丟失,即使數據庫出現故障.

4.數據庫索引

    數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更新數據庫表中數據。索引的實現通常使用 B_TREE。B_TREE 索引加速了數據訪問,因爲存儲引擎不會再去掃描整張表得到需要的數據;相反,它從根節點開始,根節點保存了子節點的指針,存儲引擎會根據指針快速尋找數據。

5.數據庫怎麼優化查詢效率

1、儲存引擎選擇:如果數據表需要事務處理,應該考慮使用 InnoDB,因爲它完全符合 ACID 特性。
如果不需要事務處理,使用默認存儲引擎 MyISAM 是比較明智的
2、分表分庫,主從。
3、對查詢進行優化,要儘量避免全表掃描,首先應考慮在 whereorder by 涉及的列上建立索
引
4、應儘量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全
表掃描
5、應儘量避免在 where 子句中使用 !=<> 操作符,否則將引擎放棄使用索引而進行全表掃
描
6、應儘量避免在 where 子句中使用 or 來連接條件,如果一個字段有索引,一個字段沒有索引,
將導致引擎放棄使用索引而進行全表掃描
7、Update 語句,如果只更改 12 個字段,不要 Update 全部字段,否則頻繁調用會引起明顯的
性能消耗,同時帶來大量日誌
8、對於多張大數據量(這裏幾百條就算大了)的表 JOIN,要先分頁再 JOIN,否則邏輯讀會很高,
性能很差。

5.Mysql 集羣的優缺點

優點:
 99.999%的高可用性
 快速的自動失效切換
 靈活的分佈式體系結構,沒有單點故障
 高吞吐量和低延遲
 可擴展性強,支持在線擴容
缺點:
 存在很多限制,比如:不支持外鍵
 部署、管理、配置很複雜
 佔用磁盤空間大、內存大
 備份和恢復不方便
 重啓的時候,數據節點將數據 load 到內存需要很長的時間

6.Mysql 各引擎之間有什麼區別

主要 MyISAM 與 InnoDB 兩個引擎,其主要區別如下:
 InnoDB 支持事務,MyISAM 不支持,這一點是非常之重要。事務是一種高級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而 MyISAM 就不可以了;
 MyISAM 適合查詢以及插入爲主的應用,InnoDB 適合頻繁修改以及涉及到安全性較高的應用;
 InnoDB 支持外鍵,MyISAM 不支持;
 MyISAM 是默認引擎,InnoDB 需要指定;
 InnoDB 不支持 FULLTEXT 類型的索引;InnoDB 中不保存表的行數,如 select count() from table 時InnoDB;需要掃描一遍整個表來
 計算有多少行,但是 MyISAM 只要簡單的讀出保存好的行數即可。注意的是,當 count()語句包含where 條件時 MyISAM 也需要掃描整個表;
 對於自增長的字段,InnoDB 中必須包含只有該字段的索引,但是在 MyISAM 表中可以和其他字段一起建立聯合索引;清空整個表時,InnoDB 是一行一行的刪除,效率非常慢。MyISAM 則會重建表;
 InnoDB 支持行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like '%lee%

7.Mysql 數據庫如何分區分表

分表可以通過三種方式:Mysql 集羣、自定義規則和 merge 存儲引擎。
分區有四類:
 RANGE 分區:基於屬於一個給定連續區間的列值,把多行分配給分區。
 LIST 分區:類似於按 RANGE 分區,區別在於 LIST 分區是基於列值匹配一個離散值集合中的某個值來進行選擇。
 HASH 分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數可以包含 MySQL 中有效的、產生非負整數值的任何表達式。
 KEY 分區:類似於按 HASH 分區,區別在於 KEY 分區只支持計算一列或多列,且 MySQL 服務器提供其自身的哈希函數。必須有一列或多列包含整數值。

8.如何對查詢命令進行優化

a. 應儘量避免全表掃描,首先應考慮在 whereorder by 涉及的列上建立索。
b. 應儘量避免在 where 子句中對字段進行 null 值判斷,避免使用!=或<>操作符,避免使用 or
連接條件,或在 where 子句中使用參數、對字段進行表達式或函數操作,否則會導致權標掃描
c. 不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算,否則系統將可能無
法正確使用索引。
d. 使用索引字段作爲條件時,如果該索引是複合索引,那麼必須使用到該索引中的第一個字段作爲
條件時才能保證系統使用該索引,否則該索引將不會被使用。
e. 很多時候可考慮用 exists 代替 in。
f. 儘量使用數字型字段。
g. 儘可能的使用 varchar/nvarchar 代替 char/nchar。

9.Sql 注入是如何產生的,如何防止

程序開發過程中不注意規範書寫 sql 語句和對特殊字符進行過濾,導致客戶端可以通過全局變量POST 和 GET 提交一些 sql 語句正常執行。產生 Sql 注入。下面是防止辦法:
a. 過濾掉一些常見的數據庫操作關鍵字,或者通過系統函數來進行過濾。
b. 在 PHP 配置文件中將 Register_globals=off;設置爲關閉狀態
c. SQL 語句書寫的時候儘量不要省略小引號(tab 鍵上面那個)和單引號
d. 提高數據庫命名技巧,對於一些重要的字段根據程序的特點命名,取不易被猜到的
e. 對於常用的方法加以封裝,避免直接暴漏 SQL 語句
f. 開啓 PHP 安全模式:Safe_mode=on;
g. 打開 magic_quotes_gpc 來防止 SQL 注入
h. 控制錯誤信息:關閉錯誤提示信息,將錯誤信息寫到系統日誌。
i. 使用 mysqli 或 pdo 預處理。

10.NoSQL 和關係數據庫的區別

a. SQL 數據存在特定結構的表中;而 NoSQL 則更加靈活和可擴展,存儲方式可以省是 JSON 文檔、
哈希表或者其他方式。
b. 在 SQL 中,必須定義好表和字段結構後才能添加數據,例如定義表的主鍵(primary key),索引
(index),觸發器(trigger),存儲過程(stored procedure)等。表結構可以在被定義之後更新,但是如果有
比較大的結構變更的話就會變得比較複雜。在 NoSQL 中,數據可以在任何時候任何地方添加,不需要
先定義表。
c. SQL 中如果需要增加外部關聯數據的話,規範化做法是在原表中增加一個外鍵,關聯外部數據表。
而在 NoSQL 中除了這種規範化的外部數據表做法以外,我們還能用如下的非規範化方式把外部數據直
接放到原數據集中,以提高查詢效率。缺點也比較明顯,更新審覈人數據的時候將會比較麻煩。
d. SQL 中可以使用 JOIN 錶鏈接方式將多個關係數據表中的數據用一條簡單的查詢語句查詢出來。
NoSQL 暫未提供類似 JOIN 的查詢方式對多個數據集中的數據做查詢。所以大部分 NoSQL 使用非規範
化的數據存儲方式存儲數據。
e. SQL 中不允許刪除已經被使用的外部數據,而 NoSQL 中則沒有這種強耦合的概念,可以隨時刪
除任何數據。
f. SQL 中如果多張表數據需要同批次被更新,即如果其中一張表更新失敗的話其他表也不能更新成
功。這種場景可以通過事務來控制,可以在所有命令完成後再統一提交事務。而 NoSQL 中沒有事務這
個概念,每一個數據集的操作都是原子級的。
g. 在相同水平的系統設計的前提下,因爲 NoSQL 中省略了 JOIN 查詢的消耗,故理論上性能上是
優於 SQL 的。

11.存儲過程和函數的區別

相同點:存儲過程和函數都是爲了可重複的執行操作數據庫的 sql 語句的集合。
1)存儲過程和函數都是一次編譯,就會被緩存起來,下次使用就直接命中已經編譯好的 sql 語句,
不需要重複使用。減少網絡交互,減少網絡訪問流量。
不同點:標識符不同,函數的標識符是 function,存儲過程是 proceduce。
1)函數中有返回值,且必須有返回值,而過程沒有返回值,但是可以通過設置參數類型(in,out)
來實現多個參數或者返回值。
2)存儲函數使用 select 調用,存儲過程需要使用 call 調用。
3select 語句可以在存儲過程中調用,但是除了 select..into 之外的 select 語句都不能在函數中使
用。
4)通過 in out 參數,過程相關函數更加靈活,可以返回多個結果

12.Mysql 日誌

錯誤日誌:記錄啓動,運行或者停止 mysql 時出現的問題;
通用日誌:記錄建立的客戶端連接和執行的語句;
二進制日誌:記錄所有更改數據的語句;

Mongdb

1.Mongo 數據庫的一些基本操作命令

a) create database name; 創建數據庫
b) use databasename; 選擇數據庫
c) drop database name 直接刪除數據庫,不提醒
d) show tables; 顯示錶
e) describe tablename; 表的詳細描述
f) select 中加上 distinct 去除重複字段
g) mysqladmin drop databasename 刪除數據庫前,有提示。
h) 顯示當前 mysql 版本和當前日期
i) select version(),current_date;

2.MongoDB的定義和優缺點

MongoDB 是一個面向文檔的數據庫系統。使用 C++編寫,不支持 SQL,但有自己功能強大
的查詢語法。
MongoDB 使用 BSON 作爲數據存儲和傳輸的格式。BSON 是一種類似 JSON 的二進制序列
化文檔,支持嵌套對象和數組。
MongoDB 很像 MySQL,document 對應 MySQL 的 row,collection 對應 MySQL 的 table
應用場景:
a) 網站數據:mongo 非常適合實時的插入,更新與查詢,並具備網站實時數據存儲所需
的複製及高度伸縮性。
b) 緩存:由於性能很高,mongo 也適合作爲信息基礎設施的緩存層。在系統重啓之後,
由 mongo 搭建的持久化緩存可以避免下層的數據源過載。
c) 大尺寸、低價值的數據:使用傳統的關係數據庫存儲一些數據時可能會比較貴,在此
之前,很多程序員往往會選擇傳統的文件進行存儲。
d) 高伸縮性的場景:mongo 非常適合由數十或者數百臺服務器組成的數據庫。
e) 用於對象及 JSON 數據的存儲:mongo 的 BSON 數據格式非常適合文檔格式化的存
儲及查詢。
f) 重要數據:mysql,一般數據:mongodb,臨時數據:memcache
g) 對於關係數據表而言,mongodb 是提供了一個更快速的視圖 view;而對於 PHP 程
序而言,mongodb 可以作爲一個持久化的數組來使用,並且這個持久化的數組還可
以支持排序、條件、限制等功能
h) 將 mongodb 代替 mysql 的部分功能,主要一個思考點就是:把 mongodb 當作 mysql
的一個 view(視圖),view 是將表數據整合成業務數據的關鍵。比如說對原始數據進
行報表,那麼就要先把原始數據統計後生成 view,在對 view 進行查詢和報表。
不適合的場景:
a) 高度事物性的系統:例如銀行或會計系統。傳統的關係型數據庫目前還是更適用於需
要大量原子性複雜事務的應用程序。
b) 傳統的商業智能應用:針對特定問題的 BI 數據庫會對產生高度優化的查詢方式。對於
此類應用,數據倉庫可能是更合適的選擇。
c) 需要 SQL 的問題
d) 重要數據,關係數據
優點: 1)弱一致性(最終一致),更能保證用戶的訪問速度
2)文檔結構的存儲方式,能夠更便捷的獲取數
3)內置 GridFS,高效存儲二進制大對象 (比如照片和視頻)
4)支持複製集、主備、互爲主備、自動分片等特性
5)動態查詢
6)全索引支持,擴展到內部對象和內嵌數組
缺點: 1)不支持事務
2)MongoDB 佔用空間過大,維護工具不夠成熟

3.MongoDB 成爲優秀的 NoSQL 數據庫的原因是什麼

1)面向文件的
2)高性能
3)高可用性
4)易擴展性
5)豐富的查詢語言

4.分析器在 MongoDB 中的作用是什麼

MongoDB 中包括了一個可以顯示數據庫中每個操作性能特點的數據庫分析器。通過這個分析器
你可以找到比預期慢的查詢(或寫操作);利用這一信息,比如,可以確定是否需要添加索引

5.MySQL 與 MongoDB 本質之間最基本的差別是什麼

差別在多方面,例如:數據的表示、查詢、關係、事務、模式的設計和定義、速度和性能

Redis

1.怎樣解決數據庫高併發的問題

解決數據庫問題的常見方案:
1.分表分庫
2.數據庫索引
3.Redis緩存數據庫
4.讀寫分離
5.構建負載均衡集羣:將大量的併發請求分擔到多個處理節點,由於單個處理節點的故障不影響整個服務,負載均衡集羣同時也實現了高可用性

2.Redis集羣的實現

https://blog.csdn.net/yfkiss/article/details/38944179

3.Redis數據庫的用哪幾種數據結構存放數據

String(字符串),Hash(哈希),List(列表),Set(集合)及 zset(sortedset:有序集合。

4.Redis 的併發競爭問題怎麼解決

方案一:可以使用獨佔鎖的方式,類似操作系統的 mutex 機制,不過實現相對複雜,成本較高
https://blog.csdn.net/black_ox/article/details/48972085
方案二:使用樂觀鎖的方式進行解決(成本較低,非阻塞,性能較高)
如何用樂觀鎖方式進行解決?本質上是假設不會進行衝突,使用 redis 的命令 watch 進行構造條件

5.Redis 和MongoDB 優缺點

MongoDB 和 Redis 都是 NoSQL,採用結構型數據存儲。二者在使用場景中,存在一定的區別,
這也主要由於二者在內存映射的處理過程,持久化的處理方法不同。MongoDB 建議集羣部署,更多
的考慮到集羣方案,Redis 更偏重於進程順序寫入,雖然支持集羣,也僅限於主-從模式。
Redis 優點:
a) 讀寫性能優異
b) 支持數據持久化,支持 AOF 和 RDB 兩種持久化方式
c)支持主從複製,主機會自動將數據同步到從機,可以進行讀寫分離。
d) 數據結構豐富:除了支持 string 類型的 value 外還支持 string、hash、set、sortedset、
list 等數據結構。
缺點:
e) Redis 不具備自動容錯和恢復功能,主機從機的宕機都會導致前端部分讀寫請求失敗,需要
等待機器重啓或者手動切換前端的 IP 才能恢復。
f) 主機宕機,宕機前有部分數據未能及時同步到從機,切換 IP 後還會引入數據不一致的問題,
降低了系統的可用性。
g) Redis 的主從複製採用全量複製,複製過程中主機會 fork 出一個子進程對內存做一份快照,
並將子進程的內存快照保存爲文件發送給從機,這一過程需要確保主機有足夠多的空餘內
存。若快照文件較大,對集羣的服務能力會產生較大的影響,而且複製過程是在從機新加入
集羣或者從機和主機網絡斷開重連時都會進行,也就是網絡波動都會造成主機和從機間的一
次全量的數據複製,這對實際的系統運營造成了不小的麻煩。
h) Redis 較難支持在線擴容,在集羣容量達到上限時在線擴容會變得很複雜。爲避免這一問題,
運維人員在系統上線時必須確保有足夠的空間,這對資源造成了很大的浪費。
MongoDB 優點:
1)弱一致性(最終一致),更能保證用戶的訪問速度
2)文檔結構的存儲方式,能夠更便捷的獲取數
3)內置 GridFS,高效存儲二進制大對象 (比如照片和視頻)
4)支持複製集、主備、互爲主備、自動分片等特性
5)動態查詢
6)全索引支持,擴展到內部對象和內嵌數組
缺點:
1)不支持事務
2)MongoDB 佔用空間過大
3)維護工具不夠成熟

6.Redis 的事務

一、 Redis 事務允許一組命令在單一步驟中執行。事務有兩個屬性, 說明如下:
a) 事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按 順序地執行。事務在執行
的過程中,不會被其他客戶端發送來的命令 請求所打斷。
b) Redis 事務是原子的。原子意味着要麼所有的命令都執行,要麼 都不執行;
二、 一個事務從開始到執行會經歷以下三個階段:
a)開始事務
b)命令入隊
c)執行事務

7.Redis 的使用場景有哪些

1.取最新 N 個數據的操作
2.排行榜應用,取 TOP N 操作
3.需要精準設定過期時間的應用
4.計數器應用
5.uniq 操作,獲取某段時間所有數據排重值
6.Pub/Sub 構建實時消息系統
7.構建隊列系統
8.緩存

8.Redis 默認端口,默認過期時間,Value 最多可以容納的數據長度

1.默認端口:6379
2.默認過期時間:可以說永不過期,一般情況下,當配置中開啓了超出最大內存限制就寫磁盤的話,
那麼沒有設置過期時間的 key 可能會被寫到磁盤上。假如沒設置,那麼 REDIS 將使用 LRU
機制,將內存中的老數據刪除,並寫入新數據。
3.Value 最多可以容納的數據長度是:512M
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章