2011-05-12 83 views
1

让我们第一次进入我的情况一个重要的注意事项:最有效的数据收集方式?

  1. 我有1台在我的MySQL数据库与约10000项

目前,收集从表1#信息时。我每页收集总共20 - 24行。

的例子是:

Q1:SELECT * FROM表WHERE猫= 1 LIMIT 0,25 R1:ID:1,名称:事情,资讯:12

的PHP文件这些查询,由jquery ajax函数调用,并创建一个jquery函数读取并显示给用户的XML文件。

我的问题在这里。我该如何提高这个过程的稳定速度&。我可以有多达一万名访问者同时收集信息,这使我的服务器变得非常缓慢,甚至在某些情况下甚至崩溃。

我几乎没有想法,所以我在这里寻求帮助。这是我目前的数据收集(的实际表现:

public function collectItems($type, $genre, $page = 0, $search = 0) 
    { 
    // Call Core (Necessary for Database Interaction 
    global $plusTG; 
    // If Search 
    if($search) 
    { 
     $searchString = ' AND (name LIKE "%'.$search.'%")'; 
    } 
    else 
    { 
     $searchString = ''; 
    } 

    // Validate Query 
    $search = $plusTG->validateQuery($search); 
    $type = $plusTG->validateQuery($type); 
    $genre = $plusTG->validateQuery($genre); 

    // Check Numeric 

    if((!is_numeric($genre))) 
    { 
     return false; 
    } 
    else 
    { 
     if(!is_numeric($type)) 
     { 
     if($type != 0) 
     { 
      $typeSelect = ''; 
      $split = explode(',',$type); 

      foreach($split as $oneType) 
      { 
      if($typeSelect == '') 
      { 
       $typeSelect .= 'type = '.$oneType.' '; 
      } 
      else 
      { 
       $typeSelect .= 'OR type = '.$oneType.' '; 
      } 
      } 
     } 
     } 
     else 
     { 
     $typeSelect = 'type = ' . $type . ' '; 
     } 

     //echo $typeSelect; 
     $limit = ($page - 1) * 20; 

     if(($type != 0) && ($genre != 0)) 
     { 
     $items = $plusTG->db->query('SELECT * FROM dream_items WHERE active = 1 AND genre = '.$genre.' AND ('.$typeSelect.')'.$searchString.' ORDER BY name LIMIT '.$limit.',20'); 
     $total = $plusTG->db->query('SELECT COUNT(*) as items FROM dream_items WHERE active = 1 AND genre = '.$genre.' AND ('.$typeSelect.')'.$searchString); 
     } 
     elseif(($type == 0) && ($genre != 0)) 
     { 
     $items = $plusTG->db->query('SELECT * FROM dream_items WHERE active = 1 AND genre = '.$genre.$searchString.' ORDER BY name LIMIT '.$limit.',20'); 
     $total = $plusTG->db->query('SELECT COUNT(*) as items FROM dream_items WHERE active = 1 AND genre = '.$genre.$searchString); 
     } 
     elseif(($type != 0) && ($genre == 0)) 
     { 
     $items = $plusTG->db->query('SELECT * FROM dream_items WHERE active = 1 AND ('.$typeSelect.')'.$searchString.'ORDER BY name LIMIT '.$limit.',20'); 
     $total = $plusTG->db->query('SELECT COUNT(*) as items FROM dream_items WHERE active = 1 AND ('.$typeSelect.')'.$searchString); 
     } 
     elseif(($type == 0) && ($genre == 0)) 
     { 
     $items = $plusTG->db->query('SELECT * FROM dream_items WHERE active = 1'.$searchString.' ORDER BY name LIMIT '.$limit.',20'); 
     $total = $plusTG->db->query('SELECT COUNT(*) as items FROM dream_items WHERE active = 1'.$searchString); 
     } 

     $this->buildInfo($items->num_rows, $total->fetch_assoc()); 


     while($singleItem = $items->fetch_assoc()) 
     { 
     $this->addItem($singleItem); 
     } 
    } 
    return true; 
    } 

构建信息呼叫&添加项调用所添加的项目到DOMXML

这是我的JavaScript(域和文件名过滤):

function itemRequest(type,genre,page, search) 
{ 
    if(ajaxReady != 0) 
    { 
    ajaxReady = 0; 
    $('#item_container').text(''); 
    var searchUrl = ''; 
    var searchLink; 
    var ajaxURL; 
    if(search != 0) 
    { 
     searchUrl = '&search=' + search; 
     searchLink = search; 
     ajaxURL = "/////file.php"; 
    } 
    else 
    { 
     searchLink = 0; 
     ajaxURL = "////file.php"; 
    } 

    $.ajax({ 
     type: "GET", 
     url: ajaxURL, 
     data: "spec=1&type="+type+"&genre="+genre+"&page="+page+searchUrl, 
     success: function(itemListing){ 
     $(itemListing).find('info').each(function() 
     { 
      var total = $(this).find('total').text(); 
      updatePaging(total, page, type, genre, searchLink); 
     }); 
     var items = $(itemListing).find('items'); 

     $(items).find('item').each(function() 
     { 
      var itemId = $(this).find('id').text(); 
      var itemType = $(this).find('type').text(); 
      var itemGenre = $(this).find('genre').text(); 
      var itemTmId = $(this).find('tm').text(); 
      var itemName = $(this).find('name').text(); 

      buildItem(itemId, itemType, itemGenre, itemTmId, itemName); 
     }); 
     $('.item_one img[title]').tooltip(); 
     }, 
     complete: function(){ 
     ajaxReady = 1; 
     } 
    }); 
    } 

构建项目调用此:

function buildItem(itemId, itemType, itemGenre, itemTmId, itemName) 
{ 
    // Pick up Misc. Data 
    var typeName = nameOfType(itemType); 
    // Create Core Object 
    var anItem = $('<div/>', { 
    'class':'item_one' 
    }); 
    // Create Item Image 
    $('<img/>', { 
    'src':'///'+typeName+'_'+itemTmId+'_abc.png', 
    'alt':itemName, 
    'title':itemName, 
    click:function(){ 
     eval(typeName + 'Type = ' + itemTmId); 
     $('.equipped_item[name='+typeName+']').attr('src','//'+typeName+'_'+itemTmId+'_abc.png'); 
     $('.equipped_item[name='+typeName+']').attr('alt',itemName); 
     $('.equipped_item[name='+typeName+']').attr('title',itemName); 
     $('.equipped_item[title]').tooltip(); 
     recentEquipped(typeName, itemTmId, itemName); 
     updateSelfy(); 
    } 
    }).appendTo(anItem); 
    // Favs 
    var arrayHack = false; 
    $(favEquips).each(function(){ 
    if(arrayHack == false) 
    { 
     if(in_array(itemTmId, this)) 
     { 
     arrayHack = true; 
     } 
    } 
    }); 
    var itemFaved = ''; 
    if(arrayHack == true) 
    { 
    itemFaved = 'activated'; 
    } 
    $('<div/>',{ 
    'class':'fav', 
    'id':itemFaved, 
    click:function(){ 
     if($(this).attr('id') != 'activated') 
     { 
     $(this).attr('id','activated'); 
     } 
     else 
     { 
     $(this).removeAttr('id'); 
     } 
     itemFav(itemTmId, typeName, itemName); 
    } 
    }).appendTo(anItem); 
    $(anItem).appendTo('#item_container'); 
} 

如果任何人都可以帮助我改进此代码,它将非常感激。

回答

1
  • 索引添加到您的表cat
  • 弄清楚的瓶颈是什么,如果是那么你的XML尝试JSON,
  • 如果是您的网络,尝试启用gzip压缩
1

我同意Zepplock,重要的是要找出瓶颈在哪里 - 如果不是,你只能猜测。 Zepplock的清单是好的,但我也会添加缓存:

  • 找出瓶颈在哪里。
  • 在您的数据库表中使用索引。
  • 缓存查询结果

找到瓶颈。 有许多意见和方法可以做到这一点...基本上,当您的站点处于负载状态时,请花费时间完成流程中的每个步骤:数据库查询,服务器端进程和客户端进程。

使用指数。 如果您的数据库很慢,您可以通过优化查询来获得大量改进。表索引可能是为了...使用“解释”,以帮助确定哪些指标应该放在优化您的疑问:

EXPLAIN SELECT * FROM dream_items WHERE active = 1 AND (name LIKE "%foo%") ORDER BY name LIMIT 0,20; 

(我打赌activename指数会做的伎俩)

ALTER TABLE `dream_items` ADD INDEX `active_name` (`active` , `name`); 

还试图避免使用通配符'*'。相反,只要求你需要的列。喜欢的东西:

SELECT `id`, `type`, `genre`, `tm`, `name` FROM `dream_items` WHERE... 

缓存搜索结果。 如果数据库中的记录没有改变,那么没有理由尝试重新查询结果。使用某种缓存来减少数据库的负载(memcached,平面文件等)。根据您使用的数据库类/实用程序,它可能已经能够缓存结果。

相关问题