2011-05-12 131 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,平面文件等)。根據您使用的數據庫類/實用程序,它可能已經能夠緩存結果。

相關問題