搜索
首页数据库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、执行语句

       3、析构掉预处理语句。

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记录的最大条数。

        表`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 (?) 1000 1000 69822
2 select * from task where task.taskId in (arr) 1000 1000 66778
3 select * from task where task.taskId = ? 1 1000 1260
4 select * from task where task.taskId = id 1 1000 951
5 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 = ?";210002130
6select * 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";210001480
7select * from task where task.taskId in (?)1000100057051
8select * from task where task.taskId in (arr)1000100056235
9select * from task where task.taskId = ?11000217
10select * from task where task.taskId = id11000204
11select * 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 = ?";21000366
12select * 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中文网其他相关文章!

声明
本文转载于:CSDN。如有侵权,请联系admin@php.cn删除
MySQL的位置:数据库和编程MySQL的位置:数据库和编程Apr 13, 2025 am 12:18 AM

MySQL在数据库和编程中的地位非常重要,它是一个开源的关系型数据库管理系统,广泛应用于各种应用场景。1)MySQL提供高效的数据存储、组织和检索功能,支持Web、移动和企业级系统。2)它使用客户端-服务器架构,支持多种存储引擎和索引优化。3)基本用法包括创建表和插入数据,高级用法涉及多表JOIN和复杂查询。4)常见问题如SQL语法错误和性能问题可以通过EXPLAIN命令和慢查询日志调试。5)性能优化方法包括合理使用索引、优化查询和使用缓存,最佳实践包括使用事务和PreparedStatemen

MySQL:从小型企业到大型企业MySQL:从小型企业到大型企业Apr 13, 2025 am 12:17 AM

MySQL适合小型和大型企业。1)小型企业可使用MySQL进行基本数据管理,如存储客户信息。2)大型企业可利用MySQL处理海量数据和复杂业务逻辑,优化查询性能和事务处理。

幻影是什么读取的,InnoDB如何阻止它们(下一个键锁定)?幻影是什么读取的,InnoDB如何阻止它们(下一个键锁定)?Apr 13, 2025 am 12:16 AM

InnoDB通过Next-KeyLocking机制有效防止幻读。1)Next-KeyLocking结合行锁和间隙锁,锁定记录及其间隙,防止新记录插入。2)在实际应用中,通过优化查询和调整隔离级别,可以减少锁竞争,提高并发性能。

mysql:不是编程语言,而是...mysql:不是编程语言,而是...Apr 13, 2025 am 12:03 AM

MySQL不是一门编程语言,但其查询语言SQL具备编程语言的特性:1.SQL支持条件判断、循环和变量操作;2.通过存储过程、触发器和函数,用户可以在数据库中执行复杂逻辑操作。

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.下一个键锁是记录锁和间隙锁的组合,确保数据一致性。

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

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用