I suggest to add such a code at the end of family.module:

function family_views_pre_execute(&$view)
{
  if($view && $view->name === 'family')
  {
    switch($view->current_display){
      case 'page_1' :

      break;
      case 'page_2' :

        $cnt=db_result(db_query("SELECT count(*) AS `cnt` FROM {node} node WHERE (node.type in ('family_individual')) AND (node.status <> 0)"));
        
        $curr_page = intval($_GET['page']);
        $per_page  = intval($view->pager['items_per_page']);
        $offset    = $curr_page*$per_page;
        $view->pager['offset']=($offset>$cnt)?0:-$offset;
        
        $view->build_info['query'] ="SELECT
       `family_individual`.`nid` AS nid,
       `family_individual`.`lastname` AS family_individual_lastname,
       `family_individual`.`firstname` AS family_individual_firstname,
       `family_individual`.`middlename` AS family_individual_middlename,
       `family_individual`.`gender` AS family_individual_gender,
       `family_individual`.`birthdate` AS family_individual_birthdate,
       `family_individual`.`deathdate` AS family_individual_deathdate
FROM (
   SELECT `nid`    
   FROM {family_individual} FORCE INDEX(`lastname`)
   JOIN {node} FORCE INDEX(`type`) USING(`nid`) 
WHERE `type` IN ('%s') AND `status` <> 0
ORDER BY `lastname` ASC
LIMIT $offset, $per_page
) AS `tmp`
JOIN {family_individual} AS `family_individual` USING(`nid`)
ORDER BY `family_individual_lastname` ASC";

       
       $diff=$cnt-$offset;
$view->build_info['count_query'] ="SELECT nid FROM {node} node WHERE (node.type IN ('%s')) LIMIT $diff";               
      break;

      case 'page_3' :
        $cnt=db_result(db_query("SELECT count(*) AS `cnt` FROM {node} node WHERE (node.type in ('family_group')) AND (node.status <> 0)"));
        
        $curr_page = intval($_GET['page']);
        $per_page  = intval($view->pager['items_per_page']);
        $offset    = $curr_page*$per_page;
        $view->pager['offset']=($offset>$cnt)?0:-$offset;
        
        $view->build_info['query'] ="
SELECT
   family_group.nid AS nid,
   family_group.title_format AS node_title,
   family_group.marr_type AS family_group_marr_type,
   family_group.parent1 AS family_group_parent1,
   family_group.parent2 AS family_group_parent2
FROM (
   SELECT `nid`    
   FROM {family_group} FORCE INDEX(`nid`)
   JOIN {node} FORCE INDEX(`type`) USING(`nid`) 
WHERE `type` IN ('%s') AND `status` <> 0
ORDER BY {family_group}.`title_format` ASC
LIMIT $offset, $per_page
) AS `tmp`
 JOIN {family_group} family_group USING(`nid`)

ORDER BY node_title ASC";

        
       $diff=$cnt-$offset;
       $view->build_info['count_query'] ="SELECT nid FROM {node} node WHERE (node.type IN ('%s')) LIMIT $diff";               
          
      break;
      
      case 'page_4' :
          
      break;
      
    }  
  }
 
}

INDEXES

{node}
name: type
fields: nid, type, status

{family_individual}
name: lastname
fields: lastname, nid

{family_group}
name: nid
fields: nid, title_format

My DB is 40000+ individuals and 20000+ groups and that decreased page load time from 3-9 sec to less than a 1 sec.

Comments

avpaderno’s picture

Version: 6.x-1.2 » 6.x-1.x-dev
Status: Active » Closed (outdated)

I am closing this feature request, as it's for a not supported project version. If you want to see this feature implemented for a supported project version, please re-open this issue.