首頁 資料庫 mysql教程 介紹MySQL資料庫的預處理(prepared statement)效能測試

介紹MySQL資料庫的預處理(prepared statement)效能測試

Feb 04, 2021 am 09:03 AM
mysql

介紹MySQL資料庫的預處理(prepared statement)效能測試

#免費學習推薦:mysql影片教學

#1、預處理做了什麼

        當我們提交一個資料庫語句時,語句到達資料庫服務那邊,資料庫服務需要解析這本sql語句,比如說語法檢查,查詢條件先後最佳化,然後再執行。對於預處理,簡單來說就是把客戶端與資料庫服務原本一次互動的分成兩次。首先,提交資料庫語句,讓資料庫服務先解析這句語句。其次,提交參數,呼叫語句並執行。這樣對於多次重複執行的語句來說,可以提交並解析一次資料庫語句就可以了,然後不斷的呼叫剛剛解析過得語句並執行。這樣就省去了多次解析同一語句的時間。從而達到提高效率的目的。

        預處理語句支援佔位符(place holder),透過綁定佔位符的方式提交參數。一個很重要的一點是,能與佔位符綁定的只能是值,而不能是sql語句的一些關鍵字。例如語句:「select * from student where student.id = ?」。如果放入佔位符(?)中的是“1 or 1=1”,那麼“1 or 1=1”就會被當成一個值,即用``符號包括起來,最終這條非法的語句就出錯了。從而達到放sql注入的漏洞(sql injestion)。

       預處理機制主要的三步驟:

       1、將語句進行預處理

##       2、執行語句# 

  #       2、執行語句# 

  語句。

2、關於`performance_schema`.`prepared_statements_instances` 表的介紹

         執行sql腳本:show global variable like ‘%prepare%’。 可以看到一個叫做‘

performance_schema_max_prepared_statement_instances的系統變數。其值為0表示不啟用預處理語句效能資料記錄表`performance_schema`.`prepared_statements_instances`;-1表示記錄的數量動態處理;其他正整數值則表示performance_schema_max_prepared_statement_instances

1記錄的最大的最大條數。

        表`performance_schema`.`prepared_statements_instances`又是什麼呢?它是用來記錄預處理語句的一些基本資訊和效能資料。例如預處理語句的ID,預處理語句的名字,預處理語句的具體語句內容,預處理語句被執行的次數,每次執行耗時,每個預處理語句所屬的線程id等。當我們建立一條預處理語句時,就會插入一條資料到這張表裡。預處理語句是基於連接的,連接斷開,則預處理語句會自動刪除。但`performance_schema`.`prepared_statements_instances`表是全域的,它與資料庫連線沒關係。有了這些數據,我們就可以知道,1、程式碼中執行的語句是否真的做了預處理,2、透過了解預處理語句的執行情況來決定業務中是否需要把一個語句進行預處理。

3、qt prepare函數說明

        根據我自己本身的專案需求,這次測試的客戶程式碼使用的是Qt。這裡記錄一個關鍵的函數:QSqlQuery類別的prepare函數。呼叫prepare函數即是向資料庫提交一個建立預處理語句的命令。意味著在呼叫期間,是會與資料庫服務進行一次互動的。要注意的是,當同一個QSqlQuery類別物件呼叫第二次prepare時,會將第一次呼叫prepare建立的預處理語句刪除掉,然後再建立一條預處理語句,即便是這兩個預處理語句是一模一樣的。在呼叫QSqlQuery的exec函數時,也會將QSqlQuery先前建立的預處理語句刪除掉。所以在查詢結束,關閉掉連接,或者查詢又執行了其他語句,從而導致`performance_schema`.`prepared_statements_instances`表沒有相關預處理語句的記錄,就會誤認為預處理語句創建失敗。其實Qt的這種做法,也省了要我們人為的刪除預處理語句。

4、實驗猜想

        常規執行的語句和預處理後執行的語句不同點在於,在多次執行的情況下,預處理語句只需解析一次sql語句,而之後多花時間在傳輸參數和綁定參數上。預處理語句在傳回結果時,使用的是二進位傳輸協議,而普通語句使用的是文字格式的傳輸協定。因此我們做出以下猜想並驗證。

        1.如果執行的是簡單語句,那麼一般執行和預處理執行效能上差異不大。預處理語句在重複執行複雜的語句情況下才展現優勢。 ###

        2、查詢結果集是大資料量的情況下,預處理語句會展現出效能優勢。

5、實驗資料記錄  

##語句是否遠端資料庫傳回資料量每次實驗語句執行總次數三次實驗平均總耗時/單位毫秒#1是select * from task where task.taskId in (?)是10001000698222否select * from task where task.taskId in (arr)是10001000#667783是select * from task where task.taskId = ?是#11000#1260#4否select * from task where task.taskId = id是110009515是select * from task a LEFT JOIN task_file b ON a.taskId = b.task_id where a .taskName like '%s%' and b.file_id > 100000 and b.file_id < 200000  and a.taskId = ? ";是21000#21306否select * from task a LEFT JOIN task_file b ON a.taskId = b.task_id where a.taskName like '%s%' and b.file_id > 100000 and b.file_id < 200000  and a. taskId = 32327";是2#100014807是select * from task where task.taskId in (?)#否#10001000#570518否select * from task where task.taskId in (arr)#否 10001000562359是select * from task where task.taskId = ?否11000#21710##select * from task where task.taskId = id否11000204#11是select * from task a LEFT JOIN task_file b ON a.taskId = b.task_id where a.taskName like '%s%' and b.file_id > 100000 and b.file_id < 200000  and a.taskId = ? ";否21000##36612否select * from task a LEFT JOIN task_file b ON a.taskId = b.task_id where a.taskName like '%s%' and b.file_id > 100000 and b.file_id < 200000  and a. taskId = 32327";否2#1000#380

6、结论

         实验的数据结果和我预期的相差有点儿大,但经过反复检查测试代码和测试过程,确认测试本身应该没有问题。尊重实验数据,我们得出以下结论:

        1、通过实验5和实验6对比,实验11和实验12对比,可得猜想1是错误的。结论应该是:MySQL预处理和常规查询在简单语句和复杂语句下,都没有显著性的性能差别

        2、通过实验1和实验2对比,实验7和实验8对比,可得猜想2是错误的。结论应该是:MySQL预处理和常规查询的结果在数据传输上没有显著性的性能差距。

        3、此外,对比远程数据库和本地数据库实验数据。可得结论:MySQL数据库在本地会给数据操作带来显著性的性能提高。

相关免费学习推荐:mysql数据库(视频)

#序號 是否預處理

以上是介紹MySQL資料庫的預處理(prepared statement)效能測試的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MySQL:初學者的數據管理易用性 MySQL:初學者的數據管理易用性 Apr 09, 2025 am 12:07 AM

MySQL適合初學者使用,因為它安裝簡單、功能強大且易於管理數據。 1.安裝和配置簡單,適用於多種操作系統。 2.支持基本操作如創建數據庫和表、插入、查詢、更新和刪除數據。 3.提供高級功能如JOIN操作和子查詢。 4.可以通過索引、查詢優化和分錶分區來提升性能。 5.支持備份、恢復和安全措施,確保數據的安全和一致性。

忘記數據庫密碼,能在Navicat中找回嗎? 忘記數據庫密碼,能在Navicat中找回嗎? Apr 08, 2025 pm 09:51 PM

Navicat本身不存儲數據庫密碼,只能找回加密後的密碼。解決辦法:1. 檢查密碼管理器;2. 檢查Navicat的“記住密碼”功能;3. 重置數據庫密碼;4. 聯繫數據庫管理員。

navicat premium怎麼創建 navicat premium怎麼創建 Apr 09, 2025 am 07:09 AM

使用 Navicat Premium 創建數據庫:連接到數據庫服務器並輸入連接參數。右鍵單擊服務器並選擇“創建數據庫”。輸入新數據庫的名稱和指定字符集和排序規則。連接到新數據庫並在“對象瀏覽器”中創建表。右鍵單擊表並選擇“插入數據”來插入數據。

mysql:簡單的概念,用於輕鬆學習 mysql:簡單的概念,用於輕鬆學習 Apr 10, 2025 am 09:29 AM

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

Navicat for MariaDB如何查看數據庫密碼? Navicat for MariaDB如何查看數據庫密碼? Apr 08, 2025 pm 09:18 PM

Navicat for MariaDB 無法直接查看數據庫密碼,因為密碼以加密形式存儲。為確保數據庫安全,有三個方法可重置密碼:通過 Navicat 重置密碼,設置複雜密碼。查看配置文件(不推薦,風險高)。使用系統命令行工具(不推薦,需要對命令行工具精通)。

MySQL和SQL:開發人員的基本技能 MySQL和SQL:開發人員的基本技能 Apr 10, 2025 am 09:30 AM

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

navicat怎麼新建連接mysql navicat怎麼新建連接mysql Apr 09, 2025 am 07:21 AM

可在 Navicat 中通過以下步驟新建 MySQL 連接:打開應用程序並選擇“新建連接”(Ctrl N)。選擇“MySQL”作為連接類型。輸入主機名/IP 地址、端口、用戶名和密碼。 (可選)配置高級選項。保存連接並輸入連接名稱。

navicat如何執行sql navicat如何執行sql Apr 08, 2025 pm 11:42 PM

在 Navicat 中執行 SQL 的步驟:連接到數據庫。創建 SQL 編輯器窗口。編寫 SQL 查詢或腳本。單擊“運行”按鈕執行查詢或腳本。查看結果(如果執行查詢的話)。

See all articles