Я создал API на Symfony, который ежедневно генерирует более 1 миллиона записей в одну из таблиц MySql. Эта структура таблицы определяется следующим образом:
После нескольких недель использования в таблице уже 35 миллионов (не триллионов) строк. И когда я запрашиваю эту таблицу, время ответа составляет почти 20 секунд для простого запроса, подобного этому:
public function findAllCryptosByRank($date_minute)
{
$query = $this->_em->createQueryBuilder()
->select("cm")
->from("APIBundle:CoinmarketcapSnapshot", "cm")
->where("cm.date_minute = :date_minute")
->orderBy("cm.rank", "ASC")
->setMaxResults(10)
->setParameters(array(
'date_minute' => $date_minute,
));
$finalQuery = $query->getQuery();
return $finalQuery->getArrayResult();
}
Когда делаешь что-то более сложное, это еще хуже; запросы занимают более одной минуты. Например, для чего-то такого:
public function findAllCryptosByRank($date_minute,$date_hour,$date_day,$date_month,$date_year)
{
$query = $this->_em->createQueryBuilder()
->select("cm", "c.logo", "c.title")
->from("APIBundle:CoinmarketcapSnapshot", "cm")
->where("cm.date_minute = :date_minute")
->andWhere("cm.date_hour = :date_hour")
->andWhere("cm.date_day = :date_day")
->andWhere("cm.date_month = :date_month")
->andWhere("cm.date_year = :date_year")
->leftJoin(
'APIBundle:Cryptocurrency',
'c',
\Doctrine\ORM\Query\Expr\Join::WITH,
'cm.cryptocurrency__id = c. coinmarketcap_id'
)
->orderBy("cm.rank", "ASC")
->setMaxResults(10)
->setParameters(array('date_minute'=>$date_minute,'date_hour'=>$date_hour,'date_day'=>$date_day,'date_month'=>$date_month,'date_year'=>$date_year))
;
$finalQuery = $query->getQuery();
return $finalQuery->getArrayResult();
}
Итак, что я могу сделать, чтобы значительно улучшить эти показатели? Я читал о Doctrine, который не был разработан для случаев использования больших данных.
Я знаю, что можно улучшить производительность MySQL, используя такие инструменты, как Hadoop, или, например, оптимизируя индексы.
Но будет ли этого достаточно в связи с очень низкими показателями в данный момент?
Я хочу быть уверен, что Symfony - хороший выбор для этого приложения. Я подумываю о переносе API на другую базовую платформу, такую как ASP.NET или Node.JS. Что ты думаешь?