大量非常简单的SQL查询会影响性能吗?

时间:2013-02-06 09:59:14

标签: mysql sql performance database-performance

我有搜索过滤器。每个过滤器/属性都有我需要显示的值。

<?php foreach(getAdditionalFilters() as $attributeName => $filterData): ?>
<ul>
  <?php showLiCheckBoxes($attributeName); ?>
</ul>     
<?php endforeach; ?> 

如何显示过滤器有两种方法:

1

function showLiCheckBoxes($attribute,$checked=null){
    $CI = get_instance();
    $CI->load->model('helper_model');
    $allAttrOptions = $CI->helper_model->getAttrOptions($attribute);
    foreach($allAttrOptions as $key => $option){         
      //print html of inputs like <li><input type='checkox' value='{$option['optionId']}...
    };    
}

function getAttrOptions($attrCode){
      $sql = "SELECT option_id as optionId, label FROM eav_attribute_option
              INNER JOIN eav_attribute USING(attr_id)
              WHERE code='$attrCode'";
      $query = $this->db->prepare($sql);        
      $query->execute(); 
      $query->setFetchMode(PDO::FETCH_ASSOC);
      return $query->fetchAll();      
}

2

function showLiCheckBoxes($attribute,$checked=null){
    foreach(Attributes::${$attribute} as $key => $value){        
      //print html of inputs like <li><input type='checkox' value='{$option['optionId']}...
    };    
}

class Attributes 
{  

    public static $education        = array(0 => 'No answer', 
                                            1 => 'High school',
                                            2 => 'Some college',
                                            3 => 'In college',
                                            4 => 'College graduate',
                                            5 => 'Grad / professional school',                                    
                                            6 => 'Post grad');   
     public static $...

因此,在第一种方式中,属性选项存储在数据库中,您可以看到每个属性额外查询。在第二种方式中,属性选项存储在数组中。

我不是问哪种方法是正确的,因为这里没有其他一些事实。我要问的是,如果只有500行的表eav_attribute_option的20个额外非常简单的查询可能会对性能产生任何影响。我应该关心它还是我在这里写的查询如此简单,表格是如此之小以至于它根本没有任何区别?

当然我也可以用1个查询来做这个,但这不是问题了。我问自己,对sql server的这么多额外请求是不是坏事,而不是查询本身。

4 个答案:

答案 0 :(得分:0)

您必须对其进行分析,以了解您的方案是否需要太长时间。

无论返回的行数是多少,每个查询都有开销 因此,通常,一个返回20行的查询优于每个返回一行的20个查询。

答案 1 :(得分:0)

一般情况下,在您确实遇到问题之前,我不会担心性能问题。在性能成为问题之前很久,客户反馈可能会提示您重写该功能。

话虽如此,RBAR(row by agonizing row)是数据库的典型性能问题。往返数据库可能会很昂贵(特别是如果数据库位于不同的服务器上。)这会让您无法负载所有订单,以及这些订单中的所有产品以及这些产品的属性。 。在一个微不足道的查询中;每个实体只有一个查询,这是一场性能灾难。

所以如果没有大量工作就可以避免使用RBAR。既然你已经写出了两个场景,那么找一个查询较少的场景就不会有什么坏处。

答案 2 :(得分:0)

查询属于传统的I / O问题 - 正如其他人提到的,与应用程序不同的服务器上的数据库可能(并且很可能会)增加响应时间。还有物理I / O的问题 - 如果频繁或最近访问数据,则可能会缓存为查询返回的结果集,但如果没有,则会有数据库服务器的响应时间。

答案 3 :(得分:0)

由于上下文切换开销,额外查询会降低性能(是的,在这种情况下,返回20行的一个查询优于每个返回一行的20个查询)。

如果这些查询经常运行,如果它们可以缓存,它会大大加快速度。