Изменение запроса VIEWS

25.09.2017

Всем доброго времени суток.

Для своих целей я поставил модуль: http://drupal.org/project/family
Код не идеальный но функционал меня в принципе устраивает. ПОэтому есть желание его отрефакторить и исползовать на сайте. Насколько могу судить, модуль этот сделан с помощью Views.

Но проблема заключается в том, что после того, как я экспортнул в него свои данные (окло 60 тыс записей), то он начал тормозить. Тормозят, главным образом несколько запросов, которые я и хочу заменить, но не знаю как это сделать. В это и прошу Вашей помощи.

Запрос первый:
SELECT node.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 dru_node node
INNER JOIN dru_family_individual family_individual ON node.nid = family_individual.nid
WHERE (
node.type
IN (
'family_individual'
)
)
AND (
node.STATUS <>0
)
ORDER BY family_individual_lastname DESC
LIMIT 41840 , 40

В принципе он уже мною оптимизирован и выполняется 1 сек. Но это все равно чересчур много.
//До оптимизации там был LEFT JOIN и не было индексов некоторых.

Запрос, который я хотел бы использовать вместо него:

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 `dru_family_individual` FORCE INDEX(`lastname`)
JOIN `dru_node` FORCE INDEX(`type`) USING(`nid`)
WHERE `type` = 'family_individual' AND `status` <> 0
ORDER BY `lastname` DESC
LIMIT 40000, 40
) AS `fi_order`
JOIN `dru_family_individual` AS `family_individual` USING(`nid`)
ORDER BY `family_individual_lastname` DESC

Этот запрос в несколько раз быстрее + скорость его выполнения практически не будет расти по мере добавления данных, т.к. filesort будет происходить лишь с 40 записями.

Второй запрос:
SELECT COUNT(*) FROM (SELECT node.nid AS nid FROM dru_node node INNER JOIN dru_family_individual family_individual ON node.nid = family_individual.nid WHERE (node.type IN ('family_individual')) AND (node.STATUS <> 0) ) count_alias
Хотелось бы сделать без подзапроса, что позволило бы ему просто летать. Т.е.:

SELECT COUNT(*) FROM dru_node node INNER JOIN dru_family_individual family_individual USING (`nid`) WHERE (node.type IN ('family_individual')) AND (node.STATUS <> 0)

Очень надеюсь на Вашу помощь,
Заранее спасибо.