真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql怎么執(zhí)行查詢 mysql執(zhí)行查詢sql語句

簡(jiǎn)介mysql之mysql語句執(zhí)行流程

1.一條查詢語句如何執(zhí)行?

成都創(chuàng)新互聯(lián)主要從事網(wǎng)頁設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、響應(yīng)式網(wǎng)站、程序開發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、小程序開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營銷經(jīng)驗(yàn),集策劃、開發(fā)、設(shè)計(jì)、營銷、管理等多方位專業(yè)化運(yùn)作于一體。

2.一條更新語句如何執(zhí)行?

3.innodb的redolog是什么?

4.什么是寫緩沖

5.寫緩沖一定好嗎?

6.什么情況會(huì)引發(fā)刷臟頁

關(guān)于一條mysql查詢語句在mysql中的執(zhí)行流程

如select name from test where id=10;

1.連接器---先與mysql服務(wù)端連接器建立連接,若查詢緩存命中則直接返回 (查詢緩存的弊端:查詢緩存的失效非常頻繁,只要有對(duì)一個(gè)表的更新,這個(gè)表上所有的查詢緩存都會(huì)被清空。)

2.分析器---詞法分析告訴服務(wù)端你要干什么(我要找 test表中id為10的名字) ( 其中sql語法錯(cuò)誤在這塊暴露 )

3.優(yōu)化器---服務(wù)端會(huì)思考該怎么執(zhí)行最優(yōu)(索引的選擇)

4.執(zhí)行器---檢查用戶對(duì)庫對(duì)表的權(quán)限

5.存儲(chǔ)引擎--存儲(chǔ)數(shù)據(jù),提供讀寫接口

以u(píng)pdate a set name=1 where id=1;

主要區(qū)別在于在查詢到數(shù)據(jù)之后(select name from a where id=1),如果是innodb引擎它會(huì)進(jìn)行日志的兩階段提交:

1.開啟事務(wù),寫入redolog(innodb引擎特有),并更新內(nèi)存

3.寫入binlog,提交事務(wù),commit

我們知道m(xù)ysql數(shù)據(jù)存儲(chǔ)包含內(nèi)存與磁盤兩個(gè)部分,innodb是按數(shù)據(jù)頁(通常為16k)從磁盤讀取到內(nèi)存中的(剩余操作在內(nèi)存中執(zhí)行),當(dāng)要更新數(shù)據(jù)時(shí),若目標(biāo)數(shù)據(jù)的數(shù)據(jù)頁剛好在內(nèi)存中,則直接更新。不在呢?

將這個(gè)更新操作(也可能是插入) 緩存在change buffer中 (redolog也會(huì)記錄這個(gè)change buffer操作)等到下一次查詢要用到這些數(shù)據(jù)時(shí),再執(zhí)行這些操作,改變數(shù)據(jù)(稱為合并操作記錄稱為merge)。

innodb_change_buffer_max_size

innodb_change_buffering

先介紹兩個(gè)概念

因?yàn)閞edolog是環(huán)形日志,當(dāng)redolog寫滿時(shí),就需要“擦掉”開頭的一部分?jǐn)?shù)據(jù)來達(dá)到循環(huán)寫,這里的擦掉指,指將redolog日志的checkpoint位置從 CP推進(jìn)到CP‘ ,同時(shí)將兩點(diǎn)之間的臟頁刷到磁盤上(flush操作),此時(shí)系統(tǒng)要停止所有的更新操作(防止更新操作丟失)

1.系統(tǒng)內(nèi)存不足。當(dāng)要讀取新的內(nèi)存頁時(shí)就要淘汰一些數(shù)據(jù)頁,如果淘汰的正好是臟頁,就要執(zhí)行一次flush操作

2.Mysql認(rèn)為系統(tǒng)處于“空閑狀態(tài)”

3.正常關(guān)閉Mysql

上述后兩者場(chǎng)景(系統(tǒng)空閑和正常關(guān)閉)對(duì)于性能都沒太大影響。

當(dāng)為第一種redolog寫滿時(shí),系統(tǒng)無法執(zhí)行更新操作,所有操作都會(huì)堵塞

當(dāng)為第二種內(nèi)存不夠用時(shí),如果淘汰臟頁太多,影響mysql響應(yīng)時(shí)間

后兩者刷臟頁會(huì)影響性能,所以Mysql需要有刷臟頁控制策略,可以從以下幾個(gè)設(shè)置項(xiàng)考慮

1.設(shè)置innodb_io_capacity告訴innodb所在主機(jī)的IO能力

如何利用ClickHouse高速匯總查詢MySQL數(shù)據(jù)

直連到MySQL的功能現(xiàn)在已被添加到ClickHouse中。所以可以直接從ClickHouse查詢MySQL表中的數(shù)據(jù)。

ClickHouse是一個(gè)超高性能的海量數(shù)據(jù)快速查詢的分布式實(shí)時(shí)處理平臺(tái),在數(shù)據(jù)匯總查詢方面(如GROUP BY),ClickHouse的查詢更快,因此通常情況下在MySQL上進(jìn)行聚合。

下面是在自己的虛擬環(huán)境中做的測(cè)試記錄。既然是虛擬環(huán)境非生產(chǎn)環(huán)境,請(qǐng)看參考應(yīng)用級(jí)別,而不是嚴(yán)格的測(cè)試。

正確準(zhǔn)備和測(cè)試大約1000萬個(gè)數(shù)據(jù)項(xiàng)。

執(zhí)行腳本以創(chuàng)建樣本數(shù)據(jù)。這是約500 MB。

在MySQL中創(chuàng)建一個(gè)表并導(dǎo)入它。

由于似乎字符串?dāng)?shù)據(jù)比數(shù)字值更容易匯總,所以內(nèi)容是數(shù)字的,但它們是可變的類型。

然后執(zhí)行計(jì)算操作。

用BLOB類型做GROUPBY似乎很慢。

您可以在ClickHouse上使用MySQL數(shù)據(jù),只需在下面的表格中指定它,而不是表名。

啟動(dòng)ClickHouse客戶端并進(jìn)行測(cè)試。

如果您在啟動(dòng)時(shí)不添加--multiline選項(xiàng),則不會(huì)放置多行查詢,因此請(qǐng)繼續(xù)。

SELECT?

data1,?

COUNT(*)

FROM mysql('localhost','mikage','testdata','mikage','')?

GROUP BY data1

┌─data1─┬─COUNT()─┐

│? ? 4│1999013│

│? ? 3│1998988│

│? ? 2│1999993│

│? ? 5│2001553│

│? ? 1│2000453│

└───────┴─────────┘

5 rows in set. Elapsed: 2.685 sec. Processed 10.00 million rows,40.00 MB(3.72 million rows/s.,14.90 MB/s.)?

SELECT?

data2,?

COUNT(*)

FROM mysql('localhost','mikage','testdata','mikage','')?

GROUP BY data2

┌─data2─┬─COUNT()─┐

│6? ? │? 999786│

│8? ? │1001805│

│9? ? │1001438│

│3? ? │1000357│

│2? ? │1000648│

│4? ? │? 998349│

│5? ? │? 998889│

│10? ? │? 999424│

│1? ? │1000530│

│7? ? │? 998774│

└───────┴─────────┘

10 rows in set. Elapsed: 2.692 sec. Processed 10.00 million rows,101.00 MB(3.71 million rows/s.,37.52 MB/s.)?

SELECT?

data3,?

COUNT(*)

FROM mysql('localhost','mikage','testdata','mikage','')?

GROUP BY data3

-- 結(jié)果省略

100000 rows in set. Elapsed: 5.236 sec. Processed 10.00 million rows,138.89 MB(1.91 million rows/s.,26.52 MB/s.)?

SELECT?

data1,?

uniqExact(data5)

FROM mysql('localhost','mikage','testdata','mikage','')?

GROUP BY data1

┌─data1─┬─uniqExact(data5)─┐

│? ? 4│? ? ? ? ? 1811674│

│? ? 3│? ? ? ? ? 1812072│

│? ? 2│? ? ? ? ? 1812503│

│? ? 5│? ? ? ? ? 1814106│

│? ? 1│? ? ? ? ? 1813005│

└───────┴──────────────────┘

5 rows in set. Elapsed: 12.944 sec. Processed 10.00 million rows,198.89 MB(772.55 thousand rows/s.,15.37 MB/s.)?

-- ClickHouse有一個(gè)函數(shù)來粗略計(jì)算一個(gè)唯一的數(shù)字,所以讓我們來計(jì)算一下。

在MySQL中,相當(dāng)耗時(shí)的查詢也可以在很短的時(shí)間內(nèi)處理。

重復(fù)統(tǒng)計(jì)時(shí),最好將數(shù)據(jù)復(fù)制到ClickHouse一次。

如果您復(fù)制它,后續(xù)查詢將更快。

建議暫時(shí)使用StripeLog引擎。

如果您有一個(gè)主鍵,您可能還想要使用MergeTree表。這是在ClickHouse中最常用的引擎。

有必要用ORDER BY指定數(shù)據(jù)的排序順序(即使有重復(fù)也沒有問題)。

我會(huì)嘗試以前的查詢。以下是StripeLog引擎的測(cè)試結(jié)果。

測(cè)試耗時(shí)總結(jié)如下:

我認(rèn)為這個(gè)錯(cuò)誤很大,因?yàn)樗赩M環(huán)境下僅測(cè)試了一次

從左邊開始為,(1)MySQL中的時(shí)間 (2) ClickHouse從MySQL讀取和處理數(shù)據(jù)的時(shí)間 (3) 在ClickHouse上處理復(fù)制數(shù)據(jù)的時(shí)間。

執(zhí)行查詢 MySQL處理時(shí)間 (秒) MySQL-ClickHouse處理時(shí)間 (秒) ClickHouse處理時(shí)間 (秒)

groupby(data1) 3.22 2.685 0.071

groupby(data2) 4.01 2.692 0.177

groupby(data3) 212.82 5.236 0.779

groupby(data1)+uniq(data5) 183.56 12.944 1.725

groupby(data1)+uniq(data5)概算 (無此功能) 6.026 0.285

當(dāng)引用MySQL數(shù)據(jù)時(shí),如果沒有對(duì)應(yīng)于ClickHouse的類型,它似乎是String類型。

沒有相應(yīng)的類型如Decimal類型,所以它也是String類型。

如果你想把它作為一個(gè)數(shù)值,精度將會(huì)改變,但是似乎有必要在MySQL端保持Double類型。

而且,Date和DateTime類型在MySQL和ClickHouse之間的范圍也是不同的。

ClickHouse日期類型是1970 - 2038年之間。

如果有超出范圍的數(shù)據(jù),可能需要使其成為字符串類型,按年份,月份,日期分列,并將其作為數(shù)值復(fù)制。

參照源碼如下:

MySQL類型 ClickHouse 類型 參考

tinyint????UInt8 / Int8

smallint????UInt16 / Int16

int / mediumint????UInt32 / Int32

bigint????UInt64 / Int64

float????Float32

double????Float64

dateDate????有可以表達(dá)的范圍差異

datetime????DateTime有可以表達(dá)的范圍差異

timestamp????DateTime

binaryFixed????String

除上述以外? ? String

MySql中Sql的執(zhí)行過程

如果查詢緩存沒有命中,那么SQL請(qǐng)求會(huì)進(jìn)入分析器,分析器是用來分辨SQL語句的執(zhí)行目的,其執(zhí)行過程大致分為兩步:

表1 語法分析關(guān)鍵字然后再通過語法規(guī)則解析,判斷輸入的SQL 語句是否滿足MySQL語法,并且生成圖5的語法樹。由SQL語句生成的四個(gè)單詞中,識(shí)別出兩個(gè)關(guān)鍵字,分別是select 和from。根據(jù)MySQL的語法Select 和 from之間對(duì)應(yīng)的是fields 字段,下面應(yīng)該掛接username;在from后面跟隨的是Tables字段,其下掛接的是userinfo。

優(yōu)化器的作用是對(duì)SQL進(jìn)行優(yōu)化,生成最有的執(zhí)行方案。如圖6所示,前面提到的SQL解析器通過語法分析和語法規(guī)則生成了SQL語法樹。這個(gè)語法樹作為優(yōu)化器的輸入,而優(yōu)化器(黃色的部分)包含了邏輯變換和代價(jià)優(yōu)化兩部分的內(nèi)容。在優(yōu)化完成以后會(huì)生成SQL執(zhí)行計(jì)劃作為整個(gè)優(yōu)化過程的輸出,交給執(zhí)行器在存儲(chǔ)引擎上執(zhí)行。

所處的位置如上圖所示,這節(jié)的重點(diǎn)在優(yōu)化器中的邏輯變換和代價(jià)優(yōu)化上。

邏輯變換也就是在關(guān)系代數(shù)基礎(chǔ)上進(jìn)行變換,其目的是為了化簡(jiǎn),同時(shí)保證SQL變化前后的結(jié)果一致,也就是邏輯變化并不會(huì)帶來結(jié)果集的變化。其主要包括以下幾個(gè)方面:

這樣講概念或許有些抽象,通過圖7 來看看邏輯變化如何在SQL中執(zhí)行的吧。

如圖7所示,從上往下共有4個(gè)步驟:

1. 針對(duì)存在的SQL語句,首先通過“否定消除”,去掉條件判斷中的“NOT”。語句由原來的“or”轉(zhuǎn)換成“and”,并且大于小于符號(hào)進(jìn)行變號(hào)。藍(lán)色部分為修改前的SQL,紅色是修改以后的SQL。2. 等值傳遞,這一步很好理解分別降”t2.a=9” 和”t2.b=5”分別替換掉SQL中對(duì)應(yīng)的值。3. 接下來就是常量表達(dá)式計(jì)算,將“5+7”計(jì)算得到“12”。4. 最后是常量表達(dá)式計(jì)算后的化簡(jiǎn),將”9=10”化簡(jiǎn)為”true”帶入到最終的SQL表達(dá)式中完成優(yōu)化。

代價(jià)優(yōu)化是用來確定每個(gè)表,根據(jù)條件是否應(yīng)用索引,應(yīng)用哪個(gè)索引和確定多表連接的順序等問題。為了完成代價(jià)優(yōu)化,需要找到一個(gè)代價(jià)最小的方案。因此,優(yōu)化器是通過基于代價(jià)的計(jì)算方法來決定如何執(zhí)行查詢的(Cost-based Optimization)。簡(jiǎn)化的過程如下:

這里將配置操作的代價(jià)分為MySQL 服務(wù)層和MySQL 引擎層,MySQL 服務(wù)層主要是定義CPU的代價(jià),而MySQL 引擎層主要定義IO代價(jià)。MySQL 5.7 引入了兩個(gè)系統(tǒng)表mysql.server_cost和mysql.engine_cost來分別配置這兩個(gè)層的代價(jià)。如下:MySQL 服務(wù)層代價(jià)保存在表server_cost中,其具體內(nèi)容如下:

由上可以看出創(chuàng)建臨時(shí)表的代價(jià)是很高的,尤其是內(nèi)部的myisam或innodb臨時(shí)表。MySQL 引擎層代價(jià)保存在表engine_cost中,其具體內(nèi)容如下:

目前io_block_read_cost和memory_block_read_cost默認(rèn)值均為1,實(shí)際生產(chǎn)中建議酌情調(diào)大memory_block_read_cost,特別是對(duì)普通硬盤的場(chǎng)景。MySQL會(huì)根據(jù)SQL查詢生成的查詢計(jì)劃中對(duì)應(yīng)的操作從上面兩張代價(jià)表中查找對(duì)應(yīng)的代價(jià)值,并且進(jìn)行累加形成最終執(zhí)行SQL計(jì)劃的代價(jià)。再將多種可能的執(zhí)行計(jì)劃進(jìn)行比較,選取最小代價(jià)的計(jì)劃執(zhí)行。

當(dāng)分析器生成查詢計(jì)劃,并且經(jīng)過優(yōu)化器以后,就到了執(zhí)行器。執(zhí)行器會(huì)選擇執(zhí)行計(jì)劃開始執(zhí)行,但在執(zhí)行之前會(huì)校驗(yàn)請(qǐng)求用戶是否擁有查詢的權(quán)限,如果沒有權(quán)限,就會(huì)返回錯(cuò)誤信息,否則將會(huì)去調(diào)用MySQL引擎層的接口,執(zhí)行對(duì)應(yīng)的SQL語句并且返回結(jié)果。例如SQL:“SELECT * FROM userinfo WHERE username = 'Tom';“假設(shè) “username“ 字段沒有設(shè)置索引,就會(huì)調(diào)用存儲(chǔ)引擎從第一條開始查,如果碰到了用戶名字是” Tom“, 就將結(jié)果集返回,沒有查找到就查看下一行,重復(fù)上一步的操作,直到讀完整個(gè)表或者找到對(duì)應(yīng)的記錄。需要注意SQL語句的執(zhí)行順序并不是按照書寫順序來的,順序的定義會(huì)在分析器中做好,一般是按照如下順序:

如果命中的記錄比較多,應(yīng)用會(huì)從MySql Server一批批獲取數(shù)據(jù)

本文從MySQL中SQL語句的執(zhí)行過程作為切入點(diǎn),首先介紹了查詢請(qǐng)求的執(zhí)行流程,其中將MySQL的處理分為MySQL Server層和MySQL存儲(chǔ)引擎層。通過介紹SQL語句的流轉(zhuǎn),引出了后面要介紹的5大組件,他們分別是:連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器。后面的內(nèi)容中對(duì)每個(gè)組件進(jìn)行了詳細(xì)的介紹。連接器,負(fù)責(zé)身份認(rèn)證和權(quán)限鑒別;查詢緩存,將查詢的結(jié)果集進(jìn)行緩存,提高查詢效率;分析器,對(duì)SQL語句執(zhí)行語法分析和語法規(guī)則,生成語法樹和執(zhí)行計(jì)劃;優(yōu)化器,包括邏輯變換和代價(jià)優(yōu)化;執(zhí)行器,在檢查用戶權(quán)限以后對(duì)數(shù)據(jù)進(jìn)行逐條查詢,整個(gè)過程遵守SQL語句的執(zhí)行順序。

關(guān)于php操作mysql執(zhí)行數(shù)據(jù)庫查詢的一些常用操作匯總

php操作mysql步驟:

1.$connect=mysql_connect('localhost','root','123456')

or

die('數(shù)據(jù)庫連接失敗。'mysql_error());鏈接mysql。

2.mysql_select_db('database',$connect)選擇鏈接的數(shù)據(jù)庫。

3.mysql_query('Set

names

gb2312');$sql

=

"select

*

from

blog_article";準(zhǔn)備要查詢的數(shù)據(jù)。

4.$datas

=

mysql_query($sql);執(zhí)行sql查詢。

5.$data

=

mysql_fetch_assoc($datas)得到查詢到的緩存在內(nèi)存中的一條數(shù)據(jù)。

6.print_r($data);

相同點(diǎn):三個(gè)函數(shù)都是返回?cái)?shù)據(jù)庫中查詢到的一行數(shù)據(jù)(說的再清楚點(diǎn)就是一條數(shù)據(jù))。

不同點(diǎn):mysql_fetch_assoc()用的是數(shù)據(jù)庫中相應(yīng)的字段名作為的key值(也就是數(shù)組下標(biāo))

如:filed['id']=1;

mysql_fetch_row()用的是自動(dòng)生成的數(shù)字(從0開始依次生成)作為的key值(也就是數(shù)組下標(biāo))

如:filed[0]=1;

mysql_fetch_array()用的是自動(dòng)生成的數(shù)字(從0開始依次生成)作為的key值(也就是數(shù)組下標(biāo)),而且它還同時(shí)生成數(shù)據(jù)庫中相應(yīng)的字段名作為的key值(也就是數(shù)組下標(biāo))

如:

filed[0]=1,filed['id']=1;也就是說,mysql_fetch_array()將mysql_fetch_assoc()和mysql_fetch_row()查詢到的結(jié)果合為了一體了。

mysql_fetch_object()與mysql_fetch_assoc()差不多。只是mysql_fetch_assoc()返回的是數(shù)組。mysql_fetch_object()返回的是object對(duì)象。

mysql_insert_id() 取得上一步

INSERT

操作產(chǎn)生的

ID。

mysql_result()

函數(shù)返回結(jié)果集中一個(gè)字段的值。

mysql_num_fields()

函數(shù)返回結(jié)果集中字段的數(shù)目。

mysql_affected_rows();返回前一次

MySQL

操作所影響的記錄行數(shù)。

mysql_num_rows(mysql_query($sql))獲得結(jié)果集中行的數(shù)目。

mysql_pconnect()

函數(shù)打開一個(gè)到

MySQL

服務(wù)器的持久連接。

mysql_pconnect()

mysql_connect()

非常相似,但有兩個(gè)主要區(qū)別:

1.

當(dāng)連接的時(shí)候本函數(shù)將先嘗試尋找一個(gè)在同一個(gè)主機(jī)上用同樣的用戶名和密碼已經(jīng)打開的(持久)連接,如果找到,則返回此連接標(biāo)識(shí)而不打開新連接。

2.

其次,當(dāng)腳本執(zhí)行完畢后到

SQL

服務(wù)器的連接不會(huì)被關(guān)閉,此連接將保持打開以備以后使用(mysql_close()

不會(huì)關(guān)閉由

mysql_pconnect()

建立的連接)。

mysql_data_seek(mysql_query($sql),8);獲得結(jié)果集中的第8條數(shù)據(jù)。(mysql_num_rows(mysql_query($sql))和mysql_data_seek(mysql_query($sql),8)在mysql_unbuffered_query($sql)不可以使用。)

mysql_unbuffered_query($sql)和mysql_query($sql)效果差不多,但是

mysql_unbuffered_query($sql)不緩存。mysql_query($sql)會(huì)緩存查詢的結(jié)果。

mysql_close();關(guān)閉mysql的最近的鏈接。

mysql_field_flags(mysql_query($sql),6)返回第六個(gè)字段的表屬性輸出如:not_null

primary_key

auto_increment

。

mysql_fetch_lengths(mysql_query($sql))返回該條數(shù)據(jù)的所有字段的每個(gè)字段的長(zhǎng)度。返回的是一個(gè)數(shù)字組成的數(shù)組。

mysql_field_name(mysql_query($sql),3)返回第三個(gè)字段的字段名。

mysql_field_table(mysql_query($sql),0)返回指定字段所在的表名。

mysql_free_result(mysql_query($sql))

函數(shù)釋放結(jié)果內(nèi)存。

mysql_get_client_info()

函數(shù)返回

MySQL

客戶端信息。

mysql_get_host_info()

取得

MySQL

主機(jī)信息。

如何查詢mysql的執(zhí)行記錄

-- 打開sql 執(zhí)行記錄功能

set global log_output='TABLE'; -- 輸出到表

set global log=ON; -- 打開所有命令

執(zhí)行記錄功能general_log, 所有語句: 成功和未成功的.

set global log_slow_queries=ON; -- 打開慢查詢 sql 記錄

slow_log, 執(zhí)行成功的: 慢查詢語句和未使用索引的語句

set global long_query_time=0.1; -- 慢查詢時(shí)間限制(秒)

set global log_queries_not_using_indexes=ON; -- 記錄未使用索引的sql 語句

-- 查詢sql 執(zhí)行記錄

select * from mysql.slow_log order by 1; -- 執(zhí)行成功的:慢查詢語句,和未

使用索引的語句

select * from mysql.general_log order by 1; -- 所有語句: 成功和未成功的.-- 關(guān)閉sql 執(zhí)行記錄


分享文章:mysql怎么執(zhí)行查詢 mysql執(zhí)行查詢sql語句
文章鏈接:http://weahome.cn/article/hehdop.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部