Как оптимизировать запрос к БД
Понимаю, что вопрос может быть достаточно странным, но может кто-нибудь может мне посоветовать, как ускорить выполнение следующего запроса, который выводит более 1000-3000 строк?
$select = 'newEraM.id AS id_m, newEraM.name AS m_name, newEraOrg.id AS id_org, newEraDtForecast.id AS id_forecast, newEraDtForecast.expense AS forecast_expense, newEraOrg.name AS org_name, newEraWorks.id AS id_work, newEraWorks.name AS work_name, newEraObj.id AS id_obj, newEraObj.name AS obj_name, newEraDtObj.id AS id_dt_obj, newEraDtObj.name AS dt_obj_name, newEraObj.id_obj_types, newEraObjTypes.id AS id_obj_type, newEraObjTypes.name AS obj_type_name, newEraDtData.id AS id_dt_data, newEraObj.id_m, newEraDtObj.id_obj, newEraDtData.id_obj, newEraDtData.date AS date, newEraDtData.fact_income AS fact_income, newEraDtData.fact_expense AS fact_expense, newEraDtData.fact_inner_income AS fact_inner_income, newEraDtData.fact_inner_expense AS fact_inner_expense, newEraDtData.fact_residue AS fact_residue';
$c = $modx->newQuery('newEraDtData');
$c->select($select);
$c->innerJoin('newEraDtObj', 'newEraDtObj'); // arguments are: className, alias
$c->leftJoin('newEraDtForecast', 'newEraDtForecast', '(newEraDtObj.id = newEraDtForecast.id_obj) and (newEraDtForecast.date_from <= newEraDtData.date and newEraDtForecast.date_to >= newEraDtData.date)');
$c->innerJoin('newEraOrg', 'newEraOrg', 'newEraDtObj.id_org = newEraOrg.id');
$c->innerJoin('newEraWorks', 'newEraWorks', 'newEraDtObj.id_work = newEraWorks.id');
$c->innerJoin('newEraObj', 'newEraObj', 'newEraDtObj.id_obj = newEraObj.id');
$c->innerJoin('newEraObjTypes', 'newEraObjTypes', 'newEraObj.id_obj_types = newEraObjTypes.id');
$c->innerJoin('newEraM', 'newEraM', 'newEraObj.id_m = newEraM.id');
if ($_POST['show_org']) {
$c->where(array(
'newEraOrg.id:IN' => $_POST['show_org'],
));
}
if ($_POST['show_obj']) {
$c->where(array(
'newEraObj.id:IN' => $_POST['show_obj'],
));
}
if ($_POST['from']) {
$c->where(array(
'newEraDtData.date:>=' => $_POST['from'],
));
}
if ($_POST['to']) {
$c->where(array(
'newEraDtData.date:<=' => $_POST['to'],
));
}
$c->sortby('newEraM.id', 'ASC');
$c->sortby('newEraObj.id', 'ASC');
$c->sortby('newEraDtObj.id', 'ASC');
$c->sortby('newEraDtData.date', 'ASC');
$objects = $modx->getIterator('newEraDtData', $c);
$count_objects = $modx->getCount('newEraDtData', $c); Комментарии: 15
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Дока по explain dev.mysql.com/doc/refman/5.0/en/explain.html
Но не очень понимаю куда смотреть((
Ведь запрос идет изначально
Если там связь 1 к 1 и идет переборка именно newEraDtData. Зачем он все перебирает.
Да и в принципе почему так долго, вроде же не так много строк перебирает. Может это еще от чего-то быть?
Может я тут перемудрил что-то?
Сократилось на 3 на секунды, но все равно 4 секунды фигарит((
Гораздо проще и быстрее будет использовать: