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

时间:2012-03-28 08:42:59

标签: 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.4secs感到惊讶,因为它以前从来没有这么慢,据我所知,我没有改变程序中的任何东西应该让这个调用这么慢

这是编辑后的程序的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%之间的差异是因为这是一个不同于我在开始时提到的程序,但它大致相同)

1 个答案:

答案 0 :(得分:2)

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

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

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

您的查询是:

a)SELECT Gene FROM genotypegene WHERE Genotype like 'YYY%' (starts with )

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

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