在mysql db上优化sql选择

时间:2015-12-22 22:11:05

标签: php mysql

我已经完成了清理自定义PHP应用程序的不费吹灰之力的任务,该应用程序是在没有任何MVC或适当的设计模式的情况下构建的,并且由于每行查询,我目前在视图上遇到了巨大的性能损失。

我想了解一下从哪里开始优化以及我的时间最有利于加载问题的一般指导原则。

以下是它如何像我一样工作。例如,每一行都在运行这些功能:

$purchased = report::purchased_products_total($customer['No'],$from, $to);
$returned = report::returned_products_total($customer['No'],$from, $to);
$cust_inv = $purchased-$returned;
$on_hand_total = report::get_onhand_qty_total($customer['No'],$from, $to);
$log_sale_qty = report::get_logged_sale_qty($customer['No'],$from, $to);
$expected = $cust_inv-$log_sale_qty;
$salesman = report::get_salesman_by_code($customer['Salesperson_Code']);
$salesman_name = str_replace("'","",$salesman->Name);
$phone = str_replace("/","-",$customer['Phone_No']);
$name = str_replace("'","",$customer['Name']);

他的sql示例,这里是purchase_products_total函数:

public static function purchased_products_total($no,$from=NULL,$to=NULL,$item=FALSE){
  global $db;   
  $data= $db->QuerySingleValue("SELECT sum(a.Quantity) FROM ".INVOICE_LINES." as a
  WHERE a.Type='Item'
  AND No NOT LIKE 'ZB%' AND No NOT LIKE 'ZE%' AND No NOT LIKE 'ZN%'
  AND No NOT LIKE 'ZP%'AND No NOT LIKE 'ZR%'AND No NOT LIKE 'ZZ%'
  AND a.Sell_To_customer_No='$no'
  AND a.Stock_No!='NULL'
  AND Document_Posting_Date>='$from' 
  AND Document_Posting_Date<='$to'

  "
 );

 return $data;  
 }

发票行表是MyISAM。

如果需要,我可以发布更多功能。我运行了一次性能测试,mysql_query运行了大约3,500次,并且运行了将近3分钟。

1 个答案:

答案 0 :(得分:0)

确保所有查询字段都已编入索引。您还可以使用SUBSTRING(No, 2) IN('ZB', 'ZE', 'ZN', ...)来测试是否包含前两个字符,而不是长字符串AND ...不喜欢......

如果这种模式很常见,你甚至可以将前两个字符分成一个单独的列,或者制作一个&#34;覆盖索引&#34;这只是两个字符长。

一般情况下,尽你所能摆脱LIKE以加快速度!