本期我們用 MySQL 提供的 DBUG 工具來(lái)研究 MySQL 的 SQL 處理流程。
創(chuàng)新互聯(lián)公司聯(lián)系電話:18980820575,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),創(chuàng)新互聯(lián)公司網(wǎng)頁(yè)制作領(lǐng)域十載,包括成都木制涼亭等多個(gè)方面擁有豐富的網(wǎng)站運(yùn)維經(jīng)驗(yàn),選擇創(chuàng)新互聯(lián)公司,為網(wǎng)站錦上添花。
起手先造個(gè)實(shí)例
這里得稍微改一下實(shí)例的啟動(dòng)文件 start,將 CUSTOM_MYSQLD 改為 mysqld-debug:
重啟一下實(shí)例,加上 debug 參數(shù):
我們來(lái)做一兩個(gè)實(shí)驗(yàn),說(shuō)明 DBUG 包的作用:
先設(shè)置一個(gè)簡(jiǎn)單的調(diào)試規(guī)則,我們?cè)O(shè)置了兩個(gè)調(diào)試選項(xiàng):
d:開(kāi)啟各個(gè)調(diào)試點(diǎn)的輸出
O,/tmp/mysqld.trace:將調(diào)試結(jié)果輸出到指定文件
請(qǐng)點(diǎn)擊輸入圖片描述
然后我們創(chuàng)建了一張表,來(lái)看一下調(diào)試的輸出結(jié)果:
請(qǐng)點(diǎn)擊輸入圖片描述
可以看到 create table 的過(guò)程中,MySQL 的一些細(xì)節(jié)操作,比如分配內(nèi)存 alloc_root 等
這樣看還不夠直觀,我們?cè)黾右恍┬畔ⅲ?/p>
請(qǐng)點(diǎn)擊輸入圖片描述
來(lái)看看效果:
請(qǐng)點(diǎn)擊輸入圖片描述
可以看到輸出變成了調(diào)用樹(shù)的形式,現(xiàn)在就可以分辨出 alloc_root 分配的內(nèi)存,是為了解析 SQL 時(shí)用的(mysql_parse)
我們?cè)僭黾右恍┯杏玫男畔ⅲ?/p>
請(qǐng)點(diǎn)擊輸入圖片描述
可以看到結(jié)果中增加了文件名和行號(hào):
請(qǐng)點(diǎn)擊輸入圖片描述
現(xiàn)在我們可以在輸出中找一下統(tǒng)計(jì)表相關(guān)的信息:
請(qǐng)點(diǎn)擊輸入圖片描述
可以看到 MySQL 在這里非常機(jī)智,直接執(zhí)行了一個(gè)內(nèi)置的存儲(chǔ)過(guò)程來(lái)更新統(tǒng)計(jì)表。
沿著 que_eval_sql,可以找到其他類(lèi)似的統(tǒng)計(jì)表,比如下面這些:
請(qǐng)點(diǎn)擊輸入圖片描述
請(qǐng)點(diǎn)擊輸入圖片描述
本次實(shí)驗(yàn)中,我們借助了 MySQL 的 DBUG 包,來(lái)讓 MySQL 將處理過(guò)程暴露出來(lái)。MySQL 中類(lèi)似的技術(shù)還有不少,比如 performance_schema,OPTIMIZER_TRACE 等等。
這些技術(shù)將 MySQL 的不同方向的信息暴露出來(lái),方便大家理解其中機(jī)制。
您好,提問(wèn)者: -- 清空全部數(shù)據(jù),不寫(xiě)日志,不可恢復(fù),速度極快truncate table 表名;-- 清空全部數(shù)據(jù),寫(xiě)日志,數(shù)據(jù)可恢復(fù),速度慢delete from 表名
mysql 數(shù)據(jù)庫(kù),更新字段語(yǔ)句:
一、UPDATE:
UPDATE的功能是更新表中的數(shù)據(jù)。這的語(yǔ)法和INSERT的第二種用法相似。必須提供表名以及SET表達(dá)式,在后面可以加WHERE以限制更新的記錄范圍。
UPDATE table_anem SET column_name1 = value1, column_name2 = value2, ...
WHERE ... 。
如下面的語(yǔ)句將users表中id等于123的記錄的age改為24。
UPDATE users SET age = 24 WHERE id = 123。
從一張表更新到另一張表,SQL更新語(yǔ)句如果能實(shí)施兩表有效連接并能指定用源表的特定字段(或基于該源字段的計(jì)算表達(dá)式)準(zhǔn)確更新到被更新表的目標(biāo)字段,那么就可以實(shí)現(xiàn)高效率的更新操作。
具體的實(shí)現(xiàn)語(yǔ)句根據(jù)源表、目標(biāo)表結(jié)構(gòu)的不同以及具體的更新方式可能會(huì)有很大的變化,沒(méi)有通用的寫(xiě)法。需要指出一點(diǎn),不是所有的情況下都可以單純用SQL語(yǔ)句實(shí)現(xiàn)高效“從一張表更新到另一張表”的。良好設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)和較為簡(jiǎn)單的更新方式有利于用SQL語(yǔ)句實(shí)現(xiàn)已有表高效更新到其他表,有些情況下是無(wú)法簡(jiǎn)單實(shí)現(xiàn)SQL語(yǔ)句高效更新的,此時(shí)就只能退而求其次,借助編程手段或低效率的游標(biāo)去解決了。
下面提供一個(gè)SQL語(yǔ)句一張表更新到另一張表的例句供參考:
T1(ID,Name)
T2(ID,Name)
T1和T2具有相同“ID”的姓名可能不一致,現(xiàn)在要求將T2中不一致的姓名更新到與T1中對(duì)應(yīng)ID姓名一致,實(shí)現(xiàn)SQL更新語(yǔ)句如下
update T2 a,T1 b set a.Name=b.Name where a.ID=b.ID
UPDATE tb1,tb2 SET tb1.address=tb2.address WHERE tb1.name=tb2.name用上面這個(gè)sql語(yǔ)句,舉一反三吧
MySQL更新一個(gè)表不在另一個(gè)表中的數(shù)據(jù),我們所采用的方法是采用查找和替換的形式。