2012-01-28 2 views
2

Моя проблема заключается в следующем:MySQL подзапросов с РЕГИСТРИРУЙТЕСЬ плохой производительности

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

Таблица barcodesA имеет 4000 записей Таблица barcodesB имеет 4000 записей табличных полях как 180.000 записей

Она занимает 30 секунд, чтобы proccess запрос.

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

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 

Это один принимает < 1second.

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

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

+0

Вкратце: подзапросы медленны, избегайте их, где это возможно. – Polynomial

+1

Возможно, вы захотите запустить EXPLAIN в запросе и включить этот вывод в свой вопрос. В противном случае, есть ли у вас индексы в полях кода? Вам действительно нужно получить все данные или подмножество (на основе условия), было бы достаточно? –

ответ

0

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

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

+0

штрих-кодыА, штрих-кодыА содержит штрих-код, связанный с одеждой. Коробки содержат как 20 штрих-кодов, связанных с коробкой. Где я должен помещать индексы? Кроме того, я не использую select *, я просто хотел упростить его, можно прочитать более легко. – Fran

0

Причина для разницы в производительности ...

Первый запрос говорит ... во-первых, сделать полный союз КАЖДОЙ записи в UNIONed с КАЖДОЙ записью в B, THEN Присоединитесь к блокам кода. У профсоюза нет индекса для оптимизации.

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

+0

Как я могу проверить индекс? В какой колонке это должно быть? Запомните таблицы: штрих-кодыA> штрих-код, seasson, модель, цвет barcodesB> barcde, seasson, model, color .------. ::::: ::::: пример 84232323232, 1, 100, 225 коробки> boxNumber, штрих-код, детали ::::: ::::: пример 000000000001, 84232323232, независимо – Fran

+0

@Fran , http://dev.mysql.com/doc/refman/5.0/en/getting-information.html показывает команду «Описать таблицу {yourTable}» (среди прочих) – DRapp

+0

Вам нужен захват экрана? – Fran

Смежные вопросы