![]() |
1
1
好吧,因为我一直在抨击为缓存设置查询键的方法,而不是简单地使用查询字符串本身,所以我做了一个简单的基准测试。下面将使用普通查询字符串与首先创建MD5哈希进行比较:
代码:
|
![]() |
2
6
MySQL(像大多数DBMS一样)将缓存准备好的语句的执行计划,因此如果用户A为以下内容创建计划:
(其中v1和v2是bind vars),然后发送要由DBMS插入的值,然后用户b发送相同的查询(但插入值不同),DBMS不必重新生成计划。也就是说,找到匹配计划的是DBMS,而不是PDO。 但是,这意味着数据库上的每个操作至少需要2次往返(第一次是显示查询,第二次是显示绑定变量),而不是使用文字值的查询的单个往返,然后这会带来额外的网络成本。取消对查询/计划缓存的引用(和维护)也需要少量的成本。 关键问题是,这一成本是否高于最初生成计划的成本。 虽然(在我的经验中)使用Oracle中的预备语句显然有助于提高性能,但我不相信MySQL也是如此——但是,很大程度上取决于数据库的结构和查询的复杂性(或者更具体地说,优化器可以找到多少不同的选项来解决这个问题)。E查询)。 尝试自己测量它(提示:您可能希望将慢速查询阈值设置为0,并编写一些代码,将文字值转换回匿名表示形式,用于写入日志的查询)。 |
![]() |
3
4
相信我,在构建一个已准备好的语句缓存之前和之后,我都做过这项工作,性能提高是 非常 值得注意-请参阅此问题: Preparing SQL Statements with PDO . 这是我在后面提出的代码,带有缓存的准备语句:
因为我不需要担心查询中的冲突,所以我最终使用了
|
![]() |
4
1
据我所知,PDO不重用已经准备好的语句,因为它本身不分析查询,因此不知道它是否是同一个查询。 如果要创建已准备查询的缓存,IMHO最简单的方法是MD5散列查询字符串并生成查找表。 你每分钟执行多少个查询?如果少于几百,那么您只会使代码复杂化,性能提升将很小。 |
![]() |
5
0
使用一个MD5哈希作为键,您最终可能会得到两个导致相同MD5哈希的查询。可能性不高,但可能发生。别这样。像MD5这样的有损散列算法只是一种确定两个对象是否不同的方法,但并不是一种安全的识别方法。 |
![]() |
hello_programmers · Mysql从其他表输出一列 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |
![]() |
Popo · Sql查询:返回数据库中不可用的where条件 1 年前 |
|
Hamdan Nuramdani · 对账单中一周内不同表中的数据求和 2 年前 |
|
Kugelfisch · 用php为数据库加密数据 2 年前 |