2010-08-31 2 views
3

Я создал индексирование на своих таблицах, а затем я запускаю те же запросы, используя два разных способа: я запускаю эти запросы на MySql, но всегда получаю другое время выполнения, иногда сначала быстрее, а иногда и второе ..Thats почему я хочу эксперт мнения по this.Queries является первых из них являетсяКакой запрос будет выполняться быстрее в MySql

select t1.field 
    from table1 as t1 
    where t1.field in (
     select t2.field 
     from table2 as t2 
     where t2.field in (
     select t3.field from table3 as t3 
      where t3.field='something')) 

и Второе использования присоединиться в качестве

select t1.field 
from table1 as t1, 
     table2 as t2, 
     table3 as t3 
where t1.field = t2.field 
    and t2.field = t3.field 
    and t3.field='something' 

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

+3

Умм, почему бы вам не запустить их и не увидеть сами? –

+1

вы можете запустить его и попробовать, мое мнение в том, что sub-запросы медленны !!, выберите вариант 2 –

+0

Это то, что довольно тривиально для тестирования самостоятельно ... –

ответ

3

Второй подход будет быстрее, чем первый.

собственно индексация будет, имеющих индексы на t1 (поля), t2 (поле), t3 (поле)

при использовании объяснить для первого подхода, вы увидите, что MySQL создаст две производные таблицы для обоих два подзапросов

в то время как во втором подходе строка, рассмотренный MySQL будет гораздо меньше

+0

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

+1

mysql объединяет таблицы слева направо, но порядок таблиц определяется оптимизатором запросов, если вы запустите объяснение, вы увидите, что порядок соединения будет table3 join table2 join table1 почему mysql делает это потому что строки могут быть уменьшены по таблице фильтров3 на основе поля = «что-то», и, следовательно, будет меньше строк для присоединения к таблице2 и таблице1. Эти вещи необходимо учитывать при разработке запросов и схем –

+0

спасибо за объяснение Ovais. – Rupeshit

2

Только вы можете ответить на свой вопрос, потому что только у вас есть доступ к точной комбинации аппаратного обеспечения, программного обеспечения, схемы, индексов, данных и т. Д., С которыми ваши запросы будут работать.

Посмотрите на инструкцию MySQL EXPLAIN.

2

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

Подзапросы в предложении WHERE лучше избегать, поскольку они могут быть выполнены для каждой строки. Когда требуется подзапрос, он лучше всего используется в предложении FROM, создавая derived table. Например.

SELECT * 
FROM 
    some_table 
    INNER JOIN (
    SELECT * FROM another_table 
) derived_table ON some_table.id = derived_table.id 
WHERE 
    some_table.x = 'y'; 
+0

Существует отличное видео Google Tech Talk где-то о MySQL и InnoDB, что объясняет это более подробно. К сожалению, сейчас у меня не получается в Google. –

2

использования присоединиться и создать индекс на тех столбцах, которые участвуют в сравнении. Затем используйте «Объяснить», чтобы проверить производительность :)

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