Какой запрос имеет лучшую производительность? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть 3 таблицы следующим образом:

class
  id:bigint(PK)
  name:varchar


principal:
  id: bigint(PK)
  pid:bigint
  flag:boolean
  uniqueConstraint(pid, flag)

entry:
  cid: (FK, reference class)
  pid: (FK, refernce principal)
  object_id: bigint
  code: tinyint
  PK: (cid, pid, obj)

Запрос должен проверить наличие записи в записи, используя набор параметров.

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

  • имя класса: Class # 3
  • основной идентификатор пользователя: 3
  • основной идентификатор роли: 2
  • идентификатор объекта: 45

Я написал 2 запроса, один с использованием join и один с использованием подзапрос :

Запрос номер 1:

select id from entry where pid in
    (select id from principal
         where (pid=2 AND role)
            OR (pid=3 AND !role)
    )
    AND cid = (select id from class where name='Class#3')
    AND object_id=45

И запрос номер 2:

select e.id from class c
            inner join entry e on e.cid=c.id and c.name='Class#3'
            inner join principal p on p.id=e.pid 
                     and p.id in ( select id from principal
                         where (pid=2 AND role)
                            OR (pid=3 AND !role)
                                 )
    where e.object_id=45

Конечно, есть дополнительное условие для проверки кода, который я не включил в запросы.

Я хочу знать, какой из них работает лучше в целом масштабная производственная среда. Предположим, есть 100 строк в классе, 10000 в основном и более 250000 в «записи», и запрос (как объяснено) должен выполняться для каждого запроса, и как минимум 3000 пользователей работают в системе постоянно и одновременно в любое время.

  1. Какой из этих запросов будет работать лучше и почему? причина так важна для дальнейших работ
  2. Есть ли лучший подход для написания запроса, чем эти 2 подхода или даже лучший подход для построения схемы?

С уважением


PS: я прочитал этот вопрос о сравнении подзапроса и соединения, но мой вопрос не совсем простое сравнение

1 Ответ

1 голос
/ 14 апреля 2020

IN ( SELECT ... ) обычно неэффективен.

OR обычно неэффективен.

JOINs часто более эффективны, чем другие способы выражения чего-либо.

Это

     where (pid=2 AND role)
        OR (pid=3 AND !role)

может быть быстрее в этом случае:

     where pid IN (2,3)
       AND ((pid=2 AND role)
         OR (pid=3 AND !role)
           )

Ускорение может произойти, если индекс может эффективно использоваться для ограничения усилия на мочу 2 и 3 до делая это OR.

Попробуйте, что прокомментировали другие и мои предложения, плюс предоставьте CREATE TABLE и EXPLAIN. Тогда я могу посоветовать по индексации.

...