Ответы пользователя по тегу Серверная оптимизация
  • Оптимизация действительно длинного запроса?

    @AlexeyVD
    Поправьте меня, если я ошибаюсь, но разве данный запрос:
                        select -(`id`) from `dialogs` where # Получаем список диалогов
                            `deleted`='0' and # Не удалённых
                            `owner`='1' and # Основная запись
                            `id` in
                                (
                                    select `id` from `dialogs` where # Диалоги
                                    `user`=:u and # В которых я включен
                                    `deleted`='0' # И из которых меня не удалили
                                )
    

    не аналогичен такому:
                        select -(`id`) from `dialogs` where # Получаем список диалогов
                            `deleted`='0' and # Не удалённых
                            `owner`='1' and # Основная запись
                            `user`=:u  # В которых я включен
    

    Вообще я бы переписал ваш вопрос как-то так (код примерный, у себя не тестировал):
    SELECT COUNT(1)
      FROM
        (
          SELECT 1
            FROM messages m1
            WHERE m.to = :u
              AND m.deleted_to = '0'
              AND m1.unread = '1'
              AND m1.from != :u
          UNION ALL
          SELECT 1
            FROM messages m2
            JOIN dialogs d1 ON m.to = -(d1.id)
            WHERE d1.deleted = '0' 
              AND d1.owner = '1'
              AND d1.user = :u
              AND m2.unread = '1'
              AND m2.from != :u
        ) sel
    

    Ну и не забывайте про соответствующие индексы.
    Ответ написан
    4 комментария