MySQL Subquery с JOIN плохой производительности - PullRequest
2 голосов
/ 29 января 2012

Моя проблема заключается в следующем:

select * from 
    (
    select * from barcodesA 
    UNION ALL 
    select * from barcodesB
    )
    as barcodesTOTAL, boxes
 where barcodesTotal.code=boxes.code;

Таблица штрих-кодов A имеет 4000 записей Таблица штрих-кодов B имеет 4000 записей Таблица содержит около 180 000 записей

Для обработки запроса требуется 30 секунд.

Еще один проблемный запрос:

select * from 
    viewBarcodesTotal, boxes
 where barcodesTotal.code=boxes.code;

viewBarcodesTotal содержит UNION ALL из обеих таблиц штрих-кодов.Это также занимает вечность.

Между тем,

        select * from barcodesA , boxes where barcodesA.code=boxes.code
        UNION ALL 
        select * from barcodesB , boxes where barcodesB.code=boxes.code

Эта процедура занимает <1 секунду. </p>

Вопрос, очевидно, ПОЧЕМУ?mysql прослушивается?

Мне нужно перейти от доступа к mysql, и мне пришлось бы переписать весь мой код, если первый параметр в ошибках.

Ответы [ 2 ]

0 голосов
/ 29 января 2012

ПРИЧИНА для разницы в производительности ...

Первый запрос говорит ... Во-первых, сделайте полное объединение КАЖДОЙ записи в A, СОЕДИНЕННОЙ с КАЖДОЙ записью в B, ТО присоединитесь к блокам в коде. У объединения нет индекса для оптимизации.

При явном применении вашего экземпляра SECOND-запроса каждая таблица по отдельности оптимизируется при объединении (очевидно, что это индекс на производительность в секунду, но я хотел бы убедиться, что обе таблицы имеют индекс для столбца «code»).

0 голосов
/ 29 января 2012

Добавьте индекс на boxes.code, если у вас его еще нет. Объединение 8000 записей (4K + 4K) с 180 000 принесет пользу из индекса на 180K стороне уравнения.

Кроме того, будьте явными и укажите нужные поля в ваших инструкциях SELECT. Использование * в запросе на производственное использование является плохим тоном, так как не требует думать о том, какие поля (и насколько велики они могут быть), не говоря уже о том, что в вашем примере есть 2 разные таблицы, barcodesa и barcodesb с потенциально различными типами данных и порядком столбцов, которые вы UNIONing ....

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