MySQL оптимизирует подзапросы - PullRequest
4 голосов
/ 02 октября 2011

Я хочу оптимизировать этот запрос (так как подзапросы в целом не быстрые), но я потерян, потому что я не могу переписать это с помощью объединений, которые повысят производительность, можете ли вы помочь mi с этим?

SELECT id, company, street, number, number_addition, postalcode, telephone
FROM clients
    WHERE (postalcode BETWEEN '1000' AND '9000') AND street = (
        SELECT DISTINCT street FROM clients WHERE (postalcode BETWEEN '1000' AND '9000') AND postalcode <= (
            SELECT MIN(postalcode) FROM clients WHERE street = 'Main Street' AND     (postalcode BETWEEN '1000' AND '9000'))
        ORDER BY postalcode DESC LIMIT 1, 1)
ORDER BY postalcode DESC, street DESC, number DESC, number_addition DESC, telephone DESC
LIMIT 1

Спасибо за ваше время, ребята.

1 Ответ

1 голос
/ 02 октября 2011

SELECT DISTINCT street ORDER BY postalcode не имеет смысла (и я думаю, что это недопустимый ANSI SQL), кроме случаев, когда postalcode функционально зависит от street - что я не думаю, так как ваш самый низкий уровень Внутренний отбор -postalcode-on-Main-Street не имеет смысла, если бы это было так. MySQL позволит вам сойти с рук, но результаты будут противоречивыми. Что ты здесь пытаешься сказать?

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

  1. получить самый низкий почтовый индекс на главной улице;
  2. получить улицу со вторым по величине почтовым индексом ниже (1) (непоследовательно);
  3. получить информацию о клиентах на улице (2).

без разницы в исполнении. (Действительно, для ясности, возможно, лучше сделать это.)

Вы могли бы переписать их как объединения, используя self-left-joins-on-less-is-null, чтобы получить минимумы / максимумы, но я не думаю, что вы получите что-нибудь это для этого примера, и это будет очень грязно, учитывая два уровня соединения и второе по величине требование. Этот запрос особенно медленный на практике? Как выглядит EXPLAIN? Вы проиндексировали postalcode и street?

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