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

介紹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 是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 是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 否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 否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中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
MySQL:世界上最受歡迎的數據庫的簡介MySQL:世界上最受歡迎的數據庫的簡介Apr 12, 2025 am 12:18 AM

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

MySQL的重要性:數據存儲和管理MySQL的重要性:數據存儲和管理Apr 12, 2025 am 12:18 AM

MySQL是一個開源的關係型數據庫管理系統,適用於數據存儲、管理、查詢和安全。 1.它支持多種操作系統,廣泛應用於Web應用等領域。 2.通過客戶端-服務器架構和不同存儲引擎,MySQL高效處理數據。 3.基本用法包括創建數據庫和表,插入、查詢和更新數據。 4.高級用法涉及復雜查詢和存儲過程。 5.常見錯誤可通過EXPLAIN語句調試。 6.性能優化包括合理使用索引和優化查詢語句。

為什麼要使用mysql?利益和優勢為什麼要使用mysql?利益和優勢Apr 12, 2025 am 12:17 AM

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

描述InnoDB鎖定機制(共享鎖,獨家鎖,意向鎖,記錄鎖,間隙鎖,下一鍵鎖)。描述InnoDB鎖定機制(共享鎖,獨家鎖,意向鎖,記錄鎖,間隙鎖,下一鍵鎖)。Apr 12, 2025 am 12:16 AM

InnoDB的鎖機制包括共享鎖、排他鎖、意向鎖、記錄鎖、間隙鎖和下一個鍵鎖。 1.共享鎖允許事務讀取數據而不阻止其他事務讀取。 2.排他鎖阻止其他事務讀取和修改數據。 3.意向鎖優化鎖效率。 4.記錄鎖鎖定索引記錄。 5.間隙鎖鎖定索引記錄間隙。 6.下一個鍵鎖是記錄鎖和間隙鎖的組合,確保數據一致性。

MySQL查詢性能差的常見原因是什麼?MySQL查詢性能差的常見原因是什麼?Apr 12, 2025 am 12:11 AM

MySQL查询性能不佳的原因主要包括没有使用索引、查询优化器选择错误的执行计划、表设计不合理、数据量过大和锁竞争。1.没有索引导致查询缓慢,添加索引后可显著提升性能。2.使用EXPLAIN命令可以分析查询计划,找出优化器错误。3.重构表结构和优化JOIN条件可改善表设计问题。4.数据量大时,采用分区和分表策略。5.高并发环境下,优化事务和锁策略可减少锁竞争。

您什麼時候應該使用複合索引與多個單列索引?您什麼時候應該使用複合索引與多個單列索引?Apr 11, 2025 am 12:06 AM

在數據庫優化中,應根據查詢需求選擇索引策略:1.當查詢涉及多個列且條件順序固定時,使用複合索引;2.當查詢涉及多個列但條件順序不固定時,使用多個單列索引。複合索引適用於優化多列查詢,單列索引則適合單列查詢。

如何識別和優化MySQL中的慢速查詢? (慢查詢日誌,performance_schema)如何識別和優化MySQL中的慢速查詢? (慢查詢日誌,performance_schema)Apr 10, 2025 am 09:36 AM

要優化MySQL慢查詢,需使用slowquerylog和performance_schema:1.啟用slowquerylog並設置閾值,記錄慢查詢;2.利用performance_schema分析查詢執行細節,找出性能瓶頸並優化。

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操作和提升代碼可讀性。

See all articles

熱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尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

記事本++7.3.1

記事本++7.3.1

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