-- 判斷存儲test是否存在,如果存在則刪除
目前成都創(chuàng)新互聯(lián)已為千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、鎮(zhèn)遠網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
DROP PROCEDURE IF EXISTS test;
-- 創(chuàng)建存儲過程
CREATE PROCEDURE test()
BEGIN
-- 聲明循環(huán)變量int型 i
DECLARE i INT DEFAULT 1;
-- 設(shè)置i=0
set i=0;
-- 循環(huán)100次
while i100 do
-- if判斷i為偶數(shù)
if i%2 = 0 THEN
-- 要實現(xiàn)的操作? CONCAT(str1,str2,...) concat函數(shù)用于拼接子串和數(shù)字類型
INSERT into user(name,addr) VALUES(CONCAT('test',i,'ss'),'addr');
end if;
-- i自增
set i=i+1;
END WHILE;
END;
-- 調(diào)用存儲過程
CALL test()
1、數(shù)據(jù)表 collect ( id, title ,info ,vtype) 就這4個字段,其中 title 用定長,info 用text, id 是逐漸,vtype是tinyint,vtype是索引。這是一個基本的新聞系統(tǒng)的簡單模型。現(xiàn)在往里面填充數(shù)據(jù),填充10萬篇新聞。
2、最后collect 為 10萬條記錄,數(shù)據(jù)庫表占用硬盤1.6G。OK ,看下面這條sql語句:select id,title from collect limit 1000,10; 很快;基本上0.01秒就OK,再看下面的select id,title from collect limit 90000,10; 從9萬條開始分頁。
3、8-9秒完成。
4、看下面一條語句:select id from collect order by id limit 90000,10; 很快,0.04秒就OK。因為用了id主鍵做索引當然快。
MySQL 的 Binlog 記錄著 MySQL 數(shù)據(jù)庫的所有變更信息,了解 Binlog 的結(jié)構(gòu)可以幫助我們解析Binlog,甚至對 Binlog 進行一些修改,或者說是“篡改”,例如實現(xiàn)類似于 Oracle 的 flashback 的功能,恢復(fù)誤刪除的記錄,把 update 的記錄再還原回去等。本文將帶您探討一下這些神奇功能的實現(xiàn),您會發(fā)現(xiàn)比您想象地要簡單得多。本文指的 Binlog 是 ROW 模式的 Binlog,這也是 MySQL 8 里的默認模式,STATEMENT 模式因為使用中有很多限制,現(xiàn)在用得越來越少了。
Binlog 由事件(event)組成,請注意是事件(event)不是事務(wù)(transaction),一個事務(wù)可以包含多個事件。事件描述對數(shù)據(jù)庫的修改內(nèi)容。
現(xiàn)在我們已經(jīng)了解了 Binlog 的結(jié)構(gòu),我們可以試著修改 Binlog 里的數(shù)據(jù)。例如前面舉例的 Binlog 刪除了一條記錄,我們可以試著把這條記錄恢復(fù),Binlog 里面有個刪除行(DELETE_ROWS_EVENT)的事件,就是這個事件刪除了記錄,這個事件和寫行(WRITE_ROWS_EVENT)的事件的數(shù)據(jù)結(jié)構(gòu)是完全一樣的,只是刪除行事件的類型是 32,寫行事件的類型是 30,我們把對應(yīng)的 Binlog 位置的 32 改成 30 即可把已經(jīng)刪除的記錄再插入回去。從前面的 “show binlog events” 里面可看到這個 DELETE_ROWS_EVENT 是從位置 378 開始的,這里的位置就是 Binlog 文件的實際位置(以字節(jié)為單位)。從事件(event)的結(jié)構(gòu)里面可以看到 type_code 是在 event 的第 5 個字節(jié),我們寫個 Python 小程序把把第383(378+5=383)字節(jié)改成 30 即可。當然您也可以用二進制編輯工具來改。
找出 Binlog 中的大事務(wù)
由于 ROW 模式的 Binlog 是每一個變更都記錄一條日志,因此一個簡單的 SQL,在 Binlog 里可能會產(chǎn)生一個巨無霸的事務(wù),例如一個不帶 where 的 update 或 delete 語句,修改了全表里面的所有記錄,每條記錄都在 Binlog 里面記錄一次,結(jié)果是一個巨大的事務(wù)記錄。這樣的大事務(wù)經(jīng)常是產(chǎn)生麻煩的根源。我的一個客戶有一次向我抱怨,一個 Binlog 前滾,滾了兩天也沒有動靜,我把那個 Binlog 解析了一下,發(fā)現(xiàn)里面有個事務(wù)產(chǎn)生了 1.4G 的記錄,修改了 66 萬條記錄!下面是一個簡單的找出 Binlog 中大事務(wù)的 Python 小程序,我們知道用 mysqlbinlog 解析的 Binlog,每個事務(wù)都是以 BEGIN 開頭,以 COMMIT 結(jié)束。我們找出 BENGIN 前面的 “# at” 的位置,檢查 COMMIT 后面的 “# at” 位置,這兩個位置相減即可計算出這個事務(wù)的大小,下面是這個 Python 程序的例子。
切割 Binlog 中的大事務(wù)
對于大的事務(wù),MySQL 會把它分解成多個事件(注意一個是事務(wù) TRANSACTION,另一個是事件 EVENT),事件的大小由參數(shù) binlog-row-event-max-size 決定,這個參數(shù)默認是 8K。因此我們可以把若干個事件切割成一個單獨的略小的事務(wù)
ROW 模式下,即使我們只更新了一條記錄的其中某個字段,也會記錄每個字段變更前后的值,這個行為是 binlog_row_image 參數(shù)控制的,這個參數(shù)有 3 個值,默認為 FULL,也就是記錄列的所有修改,即使字段沒有發(fā)生變更也會記錄。這樣我們就可以實現(xiàn)類似 Oracle 的 flashback 的功能,我個人估計 MySQL 未來的版本從可能會基于 Binlog 推出這樣的功能。
了解了 Binlog 的結(jié)構(gòu),再加上 Python 這把瑞士軍刀,我們還可以實現(xiàn)很多功能,例如我們可以統(tǒng)計哪個表被修改地最多?我們還可以把 Binlog 切割成一段一段的,然后再重組,可以靈活地進行 MySQL 數(shù)據(jù)庫的修改和遷移等工作。
需要到Eclipse來實現(xiàn)。
1、首先我們使用數(shù)據(jù)庫連接工具HeiDiSQL來連接本機的mysql數(shù)據(jù)庫,
2、使用該工具創(chuàng)建一個test數(shù)據(jù)庫,
3、在該數(shù)據(jù)庫中創(chuàng)建一張student表,該表中有id、name和age字段,我們同時給數(shù)據(jù)庫添加數(shù)據(jù),如下圖所示。
4、我們創(chuàng)建一個Student類,并為該類分別創(chuàng)建id、name和age屬性,并用private修飾符進行限定。接下來我們?yōu)檫@些屬性創(chuàng)建getter和setter方法,如下圖所示。
5、我們創(chuàng)建一個數(shù)據(jù)庫連接類,用于配置數(shù)據(jù)庫連接的屬性,如數(shù)據(jù)庫的驅(qū)動、URL、用戶名和密碼。
6、我們創(chuàng)建完數(shù)據(jù)庫的連接后,使用getConnection()方法獲取連接,
7、使用close()方法關(guān)閉連接。我們在使用mysql時需要添加smysql驅(qū)動的jar包。
8、接下來我們創(chuàng)建MVC模式中的數(shù)據(jù)持久化層,首先我們創(chuàng)建一個TestDao接口,用于定義獲取數(shù)據(jù)的方法。
9、接下來我們創(chuàng)建TestDaoImpl實現(xiàn)類,并且實現(xiàn)TestDao接口,重寫該接口中的方法,如下圖所示。
10、我們將數(shù)據(jù)以集合的形式返回,此時需要創(chuàng)建TestSverlet類進行業(yè)務(wù)邏輯處理。我們首先創(chuàng)建一個構(gòu)造方法,并在構(gòu)造方法中獲取數(shù)據(jù)庫的連接。
11、我們創(chuàng)建的TestServlet類繼承了HttpServlet類,并重寫了父類的doGet()方法,我們在該方法中創(chuàng)建TestDaoImpl的對象,并調(diào)用getAllStudent()方法進行數(shù)據(jù)的查詢,并將查詢的結(jié)果放入到request的屬性中,同時使用RequestDispatcher將請求轉(zhuǎn)發(fā)到student.jsp。
12、我們創(chuàng)建一個student.jsp的文件,在該文件中使用EL表達式和JSTL標簽來獲取request范圍的屬性數(shù)據(jù),即上一步驟的查詢結(jié)果。
13、最后我們需要在web.xml文件中配置該Servlet的請求路徑等信息,如下圖所示。
14、以上步驟完成后我們使用Tomcat啟動該項目,按照請求路徑訪問便可在頁面表格中獲取到數(shù)據(jù)庫的查詢結(jié)果。
分享名稱:mysql怎么把數(shù)據(jù)處理 mysql如何
網(wǎng)頁URL:http://chinadenli.net/article36/dogdesg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、Google、網(wǎng)頁設(shè)計公司、微信小程序、企業(yè)網(wǎng)站制作、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)