mysql - 减少 DBI::common::Fetch 的调用 (Perl)

标签 mysql perl profiling dbi

我一直在努力减少我创建的程序的运行时间。

我使用了 Profiler,它告诉我 63% 的时间花在了 DB::st::execute 上。然后我运行了一个 DBI Profiler,并发现我的哪个调用花费的时间最长:

+ 1 SELECT Gene FROM genotypegene WHERE Genotype like ?
= 754 0.163602352142334 0 0 0.0156009197235107 1332756184.24322 1332756184.74384

我将调用次数从 754 次更改为 14 次:

+ 1 SELECT Gene FROM genotypegene WHERE Genotype like ?
= 14 0.00399994850158691 0 0 0.00100016593933105 1332923220.99416 1332923221.70477

但是程序速度并没有显着提高,我的分析器现在说 100% 花在了 DBI::common::FETCH 上。我不确定这是指什么方法。

在我编辑我的程序以减少“SELECT Gene”的调用次数之前,它说 DBI::common::FETCH 需要 0.000003 秒/调用,而现在它需要 4.467... 秒/调用。为什么 DBI::common::FETCH 现在比以前花费更长的秒/调用时间? (我在两个配置文件之间注意到的唯一另一件事是原始配置文件有一个新配置文件不再有的调用。如果我在程序运行时查看配置文件,它只有一个调用,但这会增加在程序运行时及时)

谢谢!

编辑:这是我从中选择的表格(放在这里比评论部分更容易阅读):

CREATE TABLE genotypegene
(
Genotype VARCHAR(20),
Gene VARCHAR(20),
FOREIGN KEY (Genotype) REFERENCES genotype(Genotype),
FOREIGN KEY (Gene) REFERENCES gene(Gene)
)ENGINE=InnoDB;

编辑 2:

DBI 配置文件的字段位于此处:http://metacpan.org/pod/DBI::Profile#Report-Format

我能够从 700~ 升到 14 的原因是因为我作为程序员缺乏经验(自学,3 个月前才开始使用 perl)。我最初是在每次需要时从数据库中调用信息(因此多次调用相同的信息)。一旦我发现这会减慢程序速度,我就对其进行了更改,以便它在程序开始时调用我需要的信息,然后将其存储在哈希中。然后我期待这会加快程序的速度,它确实如此,但没有预期的那么快。这就是为什么我对 DBI::common::Fetch 的 4.4 秒感到惊讶,因为它以前从来没有这么慢,而且据我所知,我没有更改程序中的任何应该使这个调用这么慢的东西

这是 Devel Profile对于经过编辑的程序:

%Time    Sec.     #calls   sec/call  F  name
100.00 386198925.3409  86442494   4.467698     DBI::common::FETCH
 0.00 15263.1450  21928855   0.000696     DBI::st::execute

(还列出了很多其他功能,只是选择了感兴趣的)

这是编辑前的样子:

%Time    Sec.     #calls   sec/call  F  name
65.01 8767.3435  21766318   0.000403     DBI::st::execute
2.29  309.2408  86510899   0.000004     DBI::common::FETCH
11.52 1554.1823        0  1554.182323  *  <other>

(65% 和 63% 之间的差异是因为这个程序的运行与我一开始提到的不同,但大致相同)

最佳答案

在看到您的数据库设计后,我会根据您的查询提出两点建议。

i) 您正在使用 LIKE 查询来匹配字符串,因此在您的 GENOTYPE 列上创建一个 INDEX,这将提高性能。

ii) 根据您在列字符串上进行的匹配类型,尝试在 GENOTYPE 列上使用 MyIsam 引擎和 FULL TEXT 引擎。

您的查询是否像:

a) SELECT Gene FROM genotypegene WHERE Genotype like 'YYY%'(以 开头)

b) SELECT Gene FROM genotypegene WHERE Genotype like '%YY%'(包含 )

请分享一个确切的查询,这将有助于更多。

关于mysql - 减少 DBI::common::Fetch 的调用 (Perl),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9903952/

相关文章:

mysql - 多对多交叉表和一对一交叉表有什么区别

java - 缓存 JDBC 连接

mysql - 如何使用 hive 0.12 配置 mysql 5.5.35

Perl 编程和返回值

c++ - 如何为使用Clang LLVM编译的C++代码生成图形代码配置文件报告?

php - 如何使用mysql查询的结果作为另一个查询的列名

perl - "Dynamic"Mojolicious 中的路线

c - prof 和 gprof 有什么区别?

javascript - 在页面加载时自动记录并保存 chrome 开发人员工具分析数据?

perl - Curl Perl 模块不工作,缺少 formadd 方法