主頁 > 資料庫 > MySQL學習---->SQL查詢執行流程

MySQL學習---->SQL查詢執行流程

2023-03-15 11:57:00 資料庫

MySQL查詢執行流程

架構總覽

下面就是MySQL 的邏輯架構,sql layer主要負責如下功能:權限判斷、sql決議、執行計劃優化、query cache的處理等操作,這些操作都是在資料庫系統處理底層資料之前的作業;

Storage Engine Layer主要負責底層資料存取的實作,由多種存盤引擎共同組成,

SQL Layer 中包含了多個子模塊,

結構圖如下

1、初始化模塊

顧名思議,初始化模塊就是在mysql Server 啟動的時候,對整個系統做各種各樣的初始化操作,比如各種buffer,cache 結構的初始化和記憶體空間的申請,各種系統變數的初始化設定,各種存盤引擎的初始化設定,等等,

2、核心API

核心API 模塊主要是為了提供一些需要非常高效的底層操作功能的優化實作,包括各種底層資料結構的實作,特殊演算法的實作,字串處理,數字處理等,小檔案I/O,格式化輸

出,以及最重要的記憶體管理部分,核心API 模塊的所有源代碼都集中在mysys 和strings檔案夾下面,有興趣的讀者可以研究研究,

3、網路互動模塊

底層網路互動模塊抽象出底層網路互動所使用的介面api,實作底層網路資料的接收與發送,以方便其他各個模塊呼叫,以及對這一部分的維護,所有原始碼都在vio 檔案夾下面,

4、Client & Server 互動協議模塊

任何C/S 結構的軟體系統,都肯定會有自己獨有的資訊互動協議,MySQL 也不例外,MySQL的Client & Server 互動協議模塊部分,實作了客戶端與MySQL 互動程序中的所有協議,當然這些協議都是建立在現有的OS 和網路協議之上的,如TCP/IP 以及Unix Socket,

5、用戶模塊

用戶模塊所實作的功能,主要包括用戶的登錄連接權限控制和用戶的授權管理,他就像MySQL 的大門守衛一樣,決定是否給來訪者“開門”,

6、訪問控制模塊

造訪客人進門了就可以想干嘛就干嘛嗎?為了安全考慮,肯定不能如此隨意,這時候就需要訪問控制模塊實時監控客人的每一個動作,給不同的客人以不同的權限,訪問控制模塊實作的功能就是根據用戶模塊中各用戶的授權資訊,以及資料庫自身特有的各種約束,來控制用戶對資料的訪問,用戶模塊和訪問控制模塊兩者結合起來,組成了MySQL 整個資料庫系統的權限安全管理的功能,

7、連接管理、連接執行緒和執行緒管理

連接管理模塊負責監聽對MySQL Server 的各種請求,接收連接請求,轉發所有連接請求到執行緒管理模塊,每一個連接上MySQL Server 的客戶端請求都會被分配(或創建)一個連接執行緒為其單獨服務,而連接執行緒的主要作業就是負責MySQL Server 與客戶端的通信,接受客戶端的命令請求,傳遞Server 端的結果資訊等,執行緒管理模塊則負責管理維護這些連接執行緒,包括執行緒的創建,執行緒的cache 等,

8、Query 決議和轉發模塊

在MySQL 中我們習慣將所有Client 端發送給Server 端的命令都稱為query,在MySQLServer 里面,連接執行緒接收到客戶端的一個Query 后,會直接將該query 傳遞給專門負責

將各種Query 進行分類然后轉發給各個對應的處理模塊,這個模塊就是query 決議和轉發模塊,其主要作業就是將query 陳述句進行語意和語法的分析,然后按照不同的操作型別進行分類,然后做出針對性的轉發,

9、Query Cache 模塊

Query Cache 模塊在MySQL 中是一個非常重要的模塊,他的主要功能是將客戶端提交給MySQL 的Select 類query 請求的回傳結果集cache 到記憶體中,與該query 的一個hash 值做一個對應,該Query 所取資料的基表發生任何資料的變化之后,MySQL 會自動使該query 的Cache 失效,在讀寫比例非常高的應用系統中,Query Cache 對性能的提高是非常顯著的,當然它對記憶體的消耗也是非常大的,

10、Query 優化器模塊

Query 優化器,顧名思義,就是優化客戶端請求的query,根據客戶端請求的query 陳述句,和資料庫中的一些統計資訊,在一系列演算法的基礎上進行分析,得出一個最優的策略,告訴后面的程式如何取得這個query 陳述句的結果,

11、表變更管理模塊

表變更管理模塊主要是負責完成一些DML 和DDL 的query,如:update,delte,insert,create table,alter table 等陳述句的處理,

12、表維護模塊

表的狀態檢查,錯誤修復,以及優化和分析等作業都是表維護模塊需要做的事情,

13、系統狀態管理模塊

系統狀態管理模塊負責在客戶端請求系統狀態的時候,將各種狀態資料回傳給用戶,像DBA 常用的各種show status 命令,show variables 命令等,所得到的結果都是由這個模塊回傳的,

14、表管理器

這個模塊從名字上看來很容易和上面的表變更和表維護模塊相混淆,但是其功能與變更及維護模塊卻完全不同,大家知道,每一個MySQL 的表都有一個表的定義檔案,也就是*.frm檔案,表管理器的作業主要就是維護這些檔案,以及一個cache,該cache 中的主要內容是各個表的結構資訊,此外它還維護table 級別的鎖管理,

15、日志記錄模塊

日志記錄模塊主要負責整個系統級別的邏輯層的日志的記錄,包括error log,binarylog,slow query log 等,

16、復制模塊

復制模塊又可分為Master 模塊和Slave 模塊兩部分, Master 模塊主要負責在Replication 環境中讀取Master 端的binary 日志,以及與Slave 端的I/O 執行緒互動等作業,

Slave 模塊比Master 模塊所要做的事情稍多一些,在系統中主要體現在兩個執行緒上面,一個是負責從Master 請求和接受binary 日志,并寫入本地relay log 中的I/O 執行緒,另外一個是負責從relay log 中讀取相關日志事件,然后決議成可以在Slave 端正確執行并得到和Master 端完全相同的結果的命令并再交給Slave 執行的SQL 執行緒,

17、存盤引擎介面模塊

存盤引擎介面模塊可以說是MySQL 資料庫中最有特色的一點了,目前各種資料庫產品中,基本上只有MySQL 可以實作其底層資料存盤引擎的插件式管理,這個模塊實際上只是一個抽象類,但正是因為它成功地將各種資料處理高度抽象化,才成就了今天MySQL 可插拔存盤引擎的特色,

查詢執行流程

查詢執行的流程:

1.連接

  1.1客戶端發起一條Query請求,監聽客戶端的‘連接管理模塊'接收請求

  1.2將請求轉發到‘連接進/執行緒模塊'

  1.3呼叫‘用戶模塊'來進行授權檢查

  1.4通過檢查后,‘連接進/執行緒模塊'從‘執行緒連接池'中取出空閑的被快取的連接執行緒和客戶端請求對接,如果失敗則創建一個新的連接請求

2.處理

  2.1先查詢快取,檢查Query陳述句是否完全匹配,接著再檢查是否具有權限,都成功則直接取資料回傳

  2.2上一步有失敗則轉交給‘命令決議器',經過詞法分析,語法分析后生成決議樹

  2.3接下來是預處理階段,處理決議器無法解決的語意,檢查權限等,生成新的決議樹

  2.4再轉交給對應的模塊處理

  2.5如果是SELECT查詢還會經由‘查詢優化器'做大量的優化,生成執行計劃

  2.6模塊收到請求后,通過‘訪問控制模塊'檢查所連接的用戶是否有訪問目標表和目標欄位的權限

  2.7有則呼叫‘表管理模塊',先是查看table cache中是否存在,有則直接對應的表和獲取鎖,否則重新打開表檔案

  2.8根據表的meta資料,獲取表的存盤引擎型別等資訊,通過介面呼叫對應的存盤引擎處理

  2.9上述程序中產生資料變化的時候,若打開日志功能,則會記錄到相應二進制日志檔案中

3.結果

  3.1Query請求完成后,將結果集回傳給‘連接進/執行緒模塊'

  3.2回傳的也可以是相應的狀態標識,如成功或失敗等

  3.3‘連接進/執行緒模塊'進行后續的清理作業,并繼續等待請求或斷開與客戶端的連接

一圖小總結

接下來再走一步,讓我們看看一條SQL陳述句的前世今生,

首先看一下示例陳述句

SELECT DISTINCT
 < select_list >
FROM
 < left_table > < join_type >
JOIN < right_table > ON < join_condition >
WHERE
 < where_condition >
GROUP BY
 < group_by_list >
HAVING
 < having_condition >
ORDER BY
 < order_by_condition >
LIMIT < limit_number >

然而它的執行順序是這樣的

FROM <left_table>
ON <join_condition>
<join_type> JOIN <right_table>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
SELECT 
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number>

既然如此了,那就讓我們一步步來看看其中的細節吧,

準備作業

1.創建測驗資料庫

create database testQuery

2.創建測驗表

CREATE TABLE table1
(
 uid VARCHAR(10) NOT NULL,
 name VARCHAR(10) NOT NULL,
 PRIMARY KEY(uid)
)ENGINE=INNODB DEFAULT CHARSET=UTF8;

CREATE TABLE table2
(
 oid INT NOT NULL auto_increment,
 uid VARCHAR(10),
 PRIMARY KEY(oid)
)ENGINE=INNODB DEFAULT CHARSET=UTF8;

3.插入資料

INSERT INTO table1(uid,name) VALUES('aaa','mike'),('bbb','jack'),('ccc','mike'),('ddd','mike');

INSERT INTO table2(uid) VALUES('aaa'),('aaa'),('bbb'),('bbb'),('bbb'),('ccc'),(NULL);

4.最后想要的結果

SELECT
 a.uid,
 count(b.oid) AS total
FROM
 table1 AS a
LEFT JOIN table2 AS b ON a.uid = b.uid
WHERE
 a. NAME = 'mike'
GROUP BY
 a.uid
HAVING
 count(b.oid) < 2
ORDER BY
 total DESC
LIMIT 1;

現在開始SQL決議之旅吧!

1. FROM

當涉及多個表的時候,左邊表的輸出會作為右邊表的輸入,之后會生成一個虛擬表VT1,

(1-J1)笛卡爾積

計算兩個相關聯表的笛卡爾積(CROSS JOIN) ,生成虛擬表VT1-J1,

mysql> select * from table1,table2;
+-----+------+-----+------+
| uid | name | oid | uid |
+-----+------+-----+------+
| aaa | mike | 1 | aaa |
| bbb | jack | 1 | aaa |
| ccc | mike | 1 | aaa |
| ddd | mike | 1 | aaa |
| aaa | mike | 2 | aaa |
| bbb | jack | 2 | aaa |
| ccc | mike | 2 | aaa |
| ddd | mike | 2 | aaa |
| aaa | mike | 3 | bbb |
| bbb | jack | 3 | bbb |
| ccc | mike | 3 | bbb |
| ddd | mike | 3 | bbb |
| aaa | mike | 4 | bbb |
| bbb | jack | 4 | bbb |
| ccc | mike | 4 | bbb |
| ddd | mike | 4 | bbb |
| aaa | mike | 5 | bbb |
| bbb | jack | 5 | bbb |
| ccc | mike | 5 | bbb |
| ddd | mike | 5 | bbb |
| aaa | mike | 6 | ccc |
| bbb | jack | 6 | ccc |
| ccc | mike | 6 | ccc |
| ddd | mike | 6 | ccc |
| aaa | mike | 7 | NULL |
| bbb | jack | 7 | NULL |
| ccc | mike | 7 | NULL |
| ddd | mike | 7 | NULL |
+-----+------+-----+------+
rows in set (0.00 sec)

(1-J2)ON過濾

基于虛擬表VT1-J1這一個虛擬表進行過濾,過濾出所有滿足ON 謂詞條件的列,生成虛擬表VT1-J2,

注意:這里因為語法限制,使用了'WHERE'代替,從中也可以感受到兩者之間微妙的關系;

mysql> SELECT
 -> *
 -> FROM
 -> table1,
 -> table2
 -> WHERE
 -> table1.uid = table2.uid
 -> ;
+-----+------+-----+------+
| uid | name | oid | uid |
+-----+------+-----+------+
| aaa | mike | 1 | aaa |
| aaa | mike | 2 | aaa |
| bbb | jack | 3 | bbb |
| bbb | jack | 4 | bbb |
| bbb | jack | 5 | bbb |
| ccc | mike | 6 | ccc |
+-----+------+-----+------+
rows in set (0.00 sec)

(1-J3)添加外部列

如果使用了外連接(LEFT,RIGHT,FULL),主表(保留表)中的不符合ON條件的列也會被加入到VT1-J2中,作為外部行,生成虛擬表VT1-J3,

如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重復執行步驟1到步驟3,直到處理完所有的表為止,

mysql> SELECT
 -> *
 -> FROM
 -> table1 AS a
 -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid;
+-----+------+------+------+
| uid | name | oid | uid |
+-----+------+------+------+
| aaa | mike | 1 | aaa |
| aaa | mike | 2 | aaa |
| bbb | jack | 3 | bbb |
| bbb | jack | 4 | bbb |
| bbb | jack | 5 | bbb |
| ccc | mike | 6 | ccc |
| ddd | mike | NULL | NULL |
+-----+------+------+------+
rows in set (0.00 sec)

下面從網上找到一張很形象的關于‘SQL JOINS'的解釋圖

2. WHERE

對VT1程序中生成的臨時表進行過濾,滿足WHERE子句的列被插入到VT2表中,

注意:

此時因為分組,不能使用聚合運算;也不能使用SELECT中創建的別名;

與ON的區別:

如果有外部列,ON針對過濾的是關聯表,主表(保留表)會回傳所有的列;

如果沒有添加外部列,兩者的效果是一樣的;

應用:

對主表的過濾應該放在WHERE;

對于關聯表,先條件查詢后連接則用ON,先連接后條件查詢則用WHERE;

mysql> SELECT
 -> *
 -> FROM
 -> table1 AS a
 -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid
 -> WHERE
 -> a. NAME = 'mike';
+-----+------+------+------+
| uid | name | oid | uid |
+-----+------+------+------+
| aaa | mike | 1 | aaa |
| aaa | mike | 2 | aaa |
| ccc | mike | 6 | ccc |
| ddd | mike | NULL | NULL |
+-----+------+------+------+
rows in set (0.00 sec)

3. GROUP BY
這個子句會把VT2中生成的表按照GROUP BY中的列進行分組,生成VT3表,
注意:
其后處理程序的陳述句,如SELECT,HAVING,所用到的列必須包含在GROUP BY中,對于沒有出現的,得用聚合函式;
原因:
GROUP BY改變了對表的參考,將其轉換為新的參考方式,能夠對其進行下一級邏輯操作的列會減少;
我的理解是:
根據分組欄位,將具有相同分組欄位的記錄歸并成一條記錄,因為每一個分組只能回傳一條記錄,除非是被過濾掉了,而不在分組欄位里面的欄位可能會有多個值,多個值是無法放進一條記錄的,所以必須通過聚合函式將這些具有多值的列轉換成單值;

mysql> SELECT
 -> *
 -> FROM
 -> table1 AS a
 -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid
 -> WHERE
 -> a. NAME = 'mike'
 -> GROUP BY
 -> a.uid;
+-----+------+------+------+
| uid | name | oid | uid |
+-----+------+------+------+
| aaa | mike | 1 | aaa |
| ccc | mike | 6 | ccc |
| ddd | mike | NULL | NULL |
+-----+------+------+------+
rows in set (0.00 sec)

4. HAVING

這個子句對VT3表中的不同的組進行過濾,只作用于分組后的資料,滿足HAVING條件的子句被加入到VT4表中,

mysql> SELECT
 -> *
 -> FROM
 -> table1 AS a
 -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid
 -> WHERE
 -> a. NAME = 'mike'
 -> GROUP BY
 -> a.uid
 -> HAVING
 -> count(b.oid) < 2;
+-----+------+------+------+
| uid | name | oid | uid |
+-----+------+------+------+
| ccc | mike | 6 | ccc |
| ddd | mike | NULL | NULL |
+-----+------+------+------+
rows in set (0.00 sec)

5. SELECT

這個子句對SELECT子句中的元素進行處理,生成VT5表,

(5-J1)計算運算式 計算SELECT 子句中的運算式,生成VT5-J1

(5-J2)DISTINCT

尋找VT5-1中的重復列,并刪掉,生成VT5-J2

如果在查詢中指定了DISTINCT子句,則會創建一張記憶體臨時表(如果記憶體放不下,就需要存放在硬碟了),這張臨時表的表結構和上一步產生的虛擬表VT5是一樣的,不同的是對進行DISTINCT操作的列增加了一個唯一索引,以此來除重復資料,

mysql> SELECT
 -> a.uid,
 -> count(b.oid) AS total
 -> FROM
 -> table1 AS a
 -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid
 -> WHERE
 -> a. NAME = 'mike'
 -> GROUP BY
 -> a.uid
 -> HAVING
 -> count(b.oid) < 2;
+-----+-------+
| uid | total |
+-----+-------+
| ccc |  1 |
| ddd |  0 |
+-----+-------+
rows in set (0.00 sec)

6.ORDER BY

從VT5-J2中的表中,根據ORDER BY 子句的條件對結果進行排序,生成VT6表,

注意:

唯一可使用SELECT中別名的地方;

mysql> SELECT
 -> a.uid,
 -> count(b.oid) AS total
 -> FROM
 -> table1 AS a
 -> LEFT OUTER JOIN table2 AS b ON a.uid = b.uid
 -> WHERE
 -> a. NAME = 'mike'
 -> GROUP BY
 -> a.uid
 -> HAVING
 -> count(b.oid) < 2
 -> ORDER BY
 -> total DESC;
+-----+-------+
| uid | total |
+-----+-------+
| ccc |  1 |
| ddd |  0 |
+-----+-------+
rows in set (0.00 sec)

7.LIMIT

LIMIT子句從上一步得到的VT6虛擬表中選出從指定位置開始的指定行資料,

注意:

offset和rows的正負帶來的影響;

當偏移量很大時效率是很低的,可以這么做:

采用子查詢的方式優化,在子查詢里先從索引獲取到最大id,然后倒序排,再取N行結果集

采用INNER JOIN優化,JOIN子句里也優先從索引獲取ID串列,然后直接關聯查詢獲得最終結果

mysql> SELECT
 -> a.uid,
 -> count(b.oid) AS total
 -> FROM
 -> table1 AS a
 -> LEFT JOIN table2 AS b ON a.uid = b.uid
 -> WHERE
 -> a. NAME = 'mike'
 -> GROUP BY
 -> a.uid
 -> HAVING
 -> count(b.oid) < 2
 -> ORDER BY
 -> total DESC
 -> LIMIT 1;
+-----+-------+
| uid | total |
+-----+-------+
| ccc |  1 |
+-----+-------+
row in set (0.00 sec)

至此SQL的決議之旅就結束了,上圖總結一下:

 

 

 

作者:donleo123 出處:https://www.cnblogs.com/donleo123/ 本文如對您有幫助,還請多推薦下此文,如有錯誤歡迎指正,相互學習,共同進步,

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/546934.html

標籤:MySQL

上一篇:深入理解 Taier:MR on Yarn 的實作原理

下一篇:mysql 隱式型別轉換規則

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more