Считывание строк ниже, похоже, не является проблемой медленного запроса.
"Я запустил php-файл в Google Chrome, и он работал около 1 часа на довольно приличной машине core2duo.Но набор результатов остановился на уровне около 18 тысяч записей - я не ограничил запрос, например: "
Браузер - не лучший способ выбросить 10 миллионов записей, по крайней мере, Chrome :-),Мое предложение состоит в том, чтобы вы поместили некоторую нумерацию страниц в свой PHP-файл, чтобы вам не приходилось каждый раз устанавливать смещение вручную.Поместите простую ссылку «предыдущий-следующий», показывающую, скажем, 10000 записей на странице.
Если для запуска в браузере не требуется абсолютно другой способ, можно записать весь вывод в текстовый файл.
Некоторые примечания к запросу: есть ли конкретная причина для добавления LEFT JOIN дважды для каждой таблицы?Кажется, это как-то связано с taxon_name_element.parent_id, но так как я не уверен в требованиях и схеме таблиц, я не могу это комментировать.Но если запрос выполняется слишком медленно, рассмотрите возможность его оптимизации.
EDIT 1 - я попытался немного потренироваться в вашем запросе.И так как вам нужно как имя элемента, так и его родительское имя, я думаю, что можно сделать это в более простом запросе, не присоединяясь к одним и тем же таблицам дважды.Однако потребуется кодирование некоторой дополнительной логики.
Несколько наблюдений, которые я узнал из запроса:
- элемент и его родительское имя оба взяты из одной таблицы
taxon_name_element
- есть еще один столбец «ранг», и он также идет из одной таблицы
taxonomic_rank
как для элемента, так и для его родителя - Из этого конкретного соединения
taxon_name_element.parent_id = tne.taxon_id
я узнаю, что обаэлемент и его родитель находятся в одной таблице `taxon_name_element"
Теперь давайте посмотрим на более простой запрос:
SELECT `tr`.`rank` AS `shortrank`, `sne`.`name_element` AS `shortname`, `tne`.`parent_id`, `tne`.`taxon_id`
FROM `taxon_name_element` `tne`
LEFT JOIN `scientific_name_element` `sne` ON `tne`.`scientific_name_element_id` = `sne`.`id`
LEFT JOIN `taxon` `tax` ON `tne`.`taxon_id` = `tax`.`id`
LEFT JOIN `taxonomic_rank` `tr` ON `tr`.`id` = `tax`.`taxonomic_rank_id`;
Результирующий набор теперь будет содержать и taxon_id, и parent_id.Идея состоит в том, чтобы сохранить все результаты в массиве так, чтобы для KEY было установлено значение parent_id. Например:
$arrOutput = $arrParent = Array();
while ($row = mysql_fetch_array($result) {
$arr = Array(
'shortrank' => $row['shortrank'],
'shortname' => $row['shortname'],
'taxonid' => $row['taxon_id'],
'parentid' => $row['parent_id']
);
$arrOutput[] = $arr;
if (!empty($row['parent_id'])) {
$arrParent[$row['parent_id']] = $arr;
}
}
// $arrOutput is now the final array with all the results and you can loop through it like you do in your original code. When looping, the parent can directly be accessed using parent_id as the associative key.
foreach ($arrOutput as $arr) {
$elementName = $arr['shortname'];
$elementRank = $arr['shortrank'];
$parentName = $arrParent[$arr['parentid']]['shortname'];
$parentRank = $arrParent[$arr['parentid']]['shortrank'];
}
Надеюсь, что это имеет смысл! Что ж, приведенный выше курс нужен только в том случае, если исходный запрос стоит дорого.
ВНИМАНИЕ: приведенный выше код не проверен, и я только надеюсь, что он работает. Могут потребоваться незначительные изменения или исправления; -)