У меня есть таблица MySQL, содержащая информацию об объектах.Это выглядит так:
+--------------+----+--------+-------+
| auto_incr_id | id | type | value |
+--------------+----+--------+-------+
| 1 | 1 | length | 105 |
| 2 | 1 | weight | 17 |
| 3 | 1 | price | 104 |
| 4 | 2 | length | 111 |
| 5 | 2 | weight | 18 |
| 6 | 2 | price | 87 |
+--------------+----+--------+-------+
Я хочу получить первые x объектов, отсортированных по длине:
{
"id": 2,
"length": 111,
"weight": 18,
"price": 87
},
{
"id": 1,
"length": 105,
"weight": 17,
"price": 104
}
Вот что я делаю для достижения этой цели: во-первых, я выбираю идентификаторы:
$type = "length";
$stmt = $mysqli->prepare("SELECT id FROM table WHERE type=? ORDER BY value DESC LIMIT ?");
$stmt->bind_param('si', $type, $limit);
$stmt->execute();
$result = $stmt->get_result();
$result = $result->fetch_all(MYSQLI_ASSOC);
Далее я получаю другие значения для каждого объекта, который был выбран:
$i = 0;
while ($i < count($result)) {
$stmt = $mysqli->prepare("SELECT type, value FROM table WHERE id=?");
$stmt->bind_param('i', $result[$i]['id']);
$stmt->execute();
$result_2 = $stmt->get_result();
$fetch = $result_2->fetch_all(MYSQLI_ASSOC);
$j = 0;
while ($j < count($fetch))
{
$result[$i][$fetch[$j]['type']] = $fetch[$j]['value'];
$j++;
}
}
Это прекрасно работает для выборки, например, первых 5 ($limit = 5
), ноТеперь у меня есть сценарий использования, где я хочу получить эту информацию для лучших 10k или больше.Это занимает слишком много времени, вероятно потому, что нужно пройти цикл while и выполнить оператор для каждого найденного идентификатора.
Поэтому я ищу способ сократить время выполнения при получении этих данных.Есть идеи?