Мой SQL-запрос занимает слишком много времени, есть ли другой подход? - PullRequest
1 голос
/ 23 октября 2019

Я хочу сохранить трехмерные векторные изображения в моем MariaDB, но я считаю, что получение данных занимает слишком много времени, чтобы быть практичным.

У меня есть несколько таблиц:

таблица точек, содержащая координаты x, y и z плюс идентификатор сущности,

таблица сущностей, содержащая уникальный идентификатор, тип сущности (текст, линия, полилиния и т. д.) и другие общие атрибуты, такие как цвет и тип линии,

и некоторые вспомогательные таблицы, содержащие дополнительные значения, такие как текст, высота текста, толщина линий и флаги, разделенные на отдельные таблицы в зависимости от типа поля (varchar, int или float).

Я получаю доступ кданные через PHP выглядят следующим образом:

if($result = mysqli_query($conn, "SELECT entityID,X,Y,Z FROM dwgpoints WHERE drawing=".$DrawingID." AND blockID=".$blockID.";"))
{
  $previous_eID=0;
  while($row = mysqli_fetch_array($result))
  {
    $eID=$row['entityID'];
    if($previous_eID!=$eID)
    {
      if($previous_eID)// confirm it's not zero
        renderEntity($image_handle,$DrawingID,$previous_eID,$etype,$colour,$ltype,$points, $transformation, $clip);
      $previous_eID=$eID;
      if($eResult=mysqli_query($conn,"SELECT colour,ltype,etype FROM entity WHERE drawing=".$ID." AND eID=".$eID.";")){
        $erow=mysqli_fetch_assoc($eResult);
        $colour=$erow['colour'];
        $ltype=$erow['ltype'];
        $etype=$erow['etype'];
        $points=[[$row['X'],$row['Y'],$row['Z']]];
      }
    }else{
      $points[]=[$row['X'],$row['Y'],$row['Z']];
    }
  }
}

Этот процесс занимает до десяти минут, но я знаю, что Openstreetmaps, например, визуализирует плитки из аналогичных объемов данных.

Результатыдиректива EXPLAIN выглядит следующим образом:

MariaDB [wptest_11]> EXPLAIN SELECT entityID,X,Y,Z FROM dwgpoints WHERE drawing=2 AND blockID=-1;
+------+-------------+-----------+------+---------------+--------+---------+-------------+-------+-----------------------+
| id   | select_type | table     | type | possible_keys | key    | key_len | ref         | rows  | Extra                 |
+------+-------------+-----------+------+---------------+--------+---------+-------------+-------+-----------------------+
|    1 | SIMPLE      | dwgpoints | ref  | idx_id        | idx_id | 9       | const,const | 24939 | Using index condition |
+------+-------------+-----------+------+---------------+--------+---------+-------------+-------+-----------------------+

Можно ли упростить поиск данных, чтобы сделать процесс управляемым? У меня дешевый VPS, так что могут быть проблемы с производительностью оборудования, в этом случае обновление будет иметь большое значение? Или мне нужно переосмыслить свой подход?

Любой совет будет приветствоваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...