最有效的数据收集方式?

时间:2011-05-12 16:31:43

标签: php javascript jquery mysql sql

让我们首先了解一下我的情况:

  1. 我的MySQL数据库中有1个表,大约有1万个条目
  2. 目前,从表#1收集信息时。我每页收集的总共20到24行。

    示例:

    Q1:SELECT * FROM table WHERE cat = 1 LIMIT 0,25 R1:id:1,name:something,info:12

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

    我的问题是。我如何提高速度和速度这个过程的稳定性。我可以让多达1万名访客同时收集信息,这使我的服务器变得非常迟缓,甚至在某些情况下甚至崩溃。

    我几乎没有想法,所以我在这里寻求帮助。这是我当前数据集的实际演示文稿(:

    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');
    }
    

    如果有人可以帮我改进这段代码,我们将非常感激。

2 个答案:

答案 0 :(得分:1)

  • cat
  • 的表添加索引
  • 找出瓶颈是什么,如果是你的XML,那么试试json,
  • 如果是您的网络,请尝试启用gzip压缩

答案 1 :(得分:1)

我同意Zepplock,重要的是找出瓶颈在哪里 - 如果没有,你只是在猜测。 Zepplock的列表很好但我也会添加缓存:

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

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

使用索引。 如果您的数据库速度很慢,您可以通过优化查询获得大量改进。表索引可能是有序的...使用'EXPLAIN'来帮助确定应该放置索引的位置以优化您的查询:

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

(我打赌active上的索引和name可以做到这一点)

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

还要尽量避免使用通配符'*'。而只是要求您需要的列。类似的东西:

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

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