2014-02-25 110 views
1

我发现'SELECT'SQL查询中的'LIKE'运算符在pdo_sqlite(PHP 5.3或PHP 5.4)中速度很慢。
在sqlite3二进制文件中输入的相同查询速度更快。SQL查询中'LIKE'运算符的速度很慢,pdo_sqlite

示例代码:

<?php 
    $bdd = new PDO('sqlite:./chaines_centre.db'); 
    $reponse = $bdd->prepare("select DateMonteeAuPlan, Debut, Fin, Statut from ReportJobs where NomJob = ? and NomChaine like 'DCLC257__' order by DateMonteeAuPlan DESC limit 20;"); 
    $reponse->execute($_GET['job']); 
    while ($donnees = $reponse->fetch()) 
    { 
     // whatever... 
    } 
    $reponse->closeCursor(); 
?> 

这里是快速的 “风向标” 我做:

  1. XDebug的追踪 '上.timer' 的PDO_SQLITE措施
  2. SQLite的二进制,

NomChaine like 'DCLC257__'
●PDO_SQLITE:1.4521s✘
●sqlite3的二进制:0.084s✔

NomChaine like 'DCLC257%'
●PDO_SQLITE:1.4881s✘
●sqlite3的二进制:0.086s✔

NomChaine = 'DCLC25736'
●pdo_sqlite:0.002s✔(我认为它有点长,但非常快)
●sqlite3二进制:0.054s✔


我该如何改善这种情况?



编辑:也许我过于注重了 '喜欢' 操作。

<?php 
$bdd = new PDO('sqlite:./chaines_centre.db'); 


$time_start = microtime(true); 
$reponse = $bdd->query("select DateMonteeAuPlan, Debut, Fin, Statut from ReportJobs where NomJob = 'NSAVBASE' and NomChaine like 'DCLC257%' order by DateMonteeAuPlan DESC limit 20;"); 
$time_end = microtime(true); 

$time = $time_end - $time_start; 
echo "Situation 1 : $time second(s)<br><br>"; 
// Output : 1.3900790214539 second(s) 


$time_start = microtime(true); 
$reponse = $bdd->query("select DateMonteeAuPlan, Debut, Fin, Statut from ReportJobs where NomJob = 'NSAVBASE' and NomChaine like 'DCLC257%' limit 20;"); 
$time_end = microtime(true); 

$time = $time_end - $time_start; 
echo "Situation 2 : $time second(s)<br><br>"; 
// Output : 0.0030009746551514 seconde(s) 


$time_start = microtime(true); 
$reponse = $bdd->query("select DateMonteeAuPlan, Debut, Fin, Statut from ReportJobs where NomJob = 'NSAVBASE' and NomChaine = 'DCLC25736' order by DateMonteeAuPlan DESC limit 20;"); 
$time_end = microtime(true); 

$time = $time_end - $time_start; 
echo "Situation 3 : $time second(s)<br><br>"; 
// Output : 0 seconde(s) 
?> 

通过消除LIKE运营商或order by DateMonteeAuPlan,查询是在预期的时间执行...
它是如此奇怪。 o_O

+0

是NomChaine索引? – 2014-02-25 21:03:59

+0

如果不是,那为什么只影响PDO? – Barmar

+0

我编辑了我的第一篇文章,问题不是真的“'LIKE'运营商”相关。我在这张桌子上没有任何索引,但似乎没有问题。 – pihug12

回答

1

你是否有机会在同一个脚本中(一个接一个地)运行PDO和二进制文件?如果你这样做了,那么用二进制获得更好的结果是正常的,因为当二进制从RAM获取数据时,PDO在缓存为空(所以它碰到光盘)时运行。

对于你的第二个脚本,情况确实如此:第一个查询得到1.3+秒,因为它也读取数据,其余的则从RAM获取数据。详细请参考http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#pragma-cache_size