ФорумРазработкаБазы данных → Профи, подсобите по пересечению

Профи, подсобите по пересечению

  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 9 февраля 2011 г. 1:36, спустя 5 минут 53 секунды

    places2rides = RidePlace
    rides2users = RideUser
    places = Message49

    то бишь нужно делать этот http://pyha.ru/forum/topic/6072.msg138821#msg138821 запрос
    Спустя 54 сек.
    а зачем в ON/WHERE поместил тоже самое?

    в ON поместил это условие, как как думал, что с ним быстрее. Ну мы типа не всю таблицу джоиним а только ту, где user_id совпал
    Спустя 196 сек.
    Распиши именно на этот запрос легенду, а то имена таблиц у тебя не соответствуют тем, которые ты приводил в первом посте
    То есть, что ты вообще хотел выбрать распиши (типа так как в первом посте, но только для этого sql)

    ну да, не совпадают названия, но суть та же. Я как бы был уверен, что вам не понравится таблица Messages49, поэтому отдельно расписал красиво.

    что я хотел выбрать - в 1-м посте есть, в этом запросе тоже самое, просто имена таблиц из того дампа, что я тебе заслал. Для упрощения можно убрать подзапрос на RidersCount, но особой погоды это не сделает, все равно медленно все
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 9 февраля 2011 г. 2:19, спустя 43 минуты 32 секунды

    ну дак тип то таблиц поменяй
    Спустя 71 сек.
    http://ru.wikipedia.org/wiki/MyISAM
    почитай внимательно все недостатки
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 9 февраля 2011 г. 2:27, спустя 7 минут 30 секунд

    поменял. Не поверишь, но скорость выполнения запроса не изменилась
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 9 февраля 2011 г. 9:07, спустя 6 часов 40 минут 35 секунд


    поменял. Не поверишь, но скорость выполнения запроса не изменилась


    попробуй самую тормознутую в memory отправить
    Спустя 37 сек.
    и ваще давай ка сюда настройки /etc/my.cnf
    Спустя 53 сек.
    и лог тоже давай (что-то вроде /var/log/mysql/mysql.log)
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 9 февраля 2011 г. 10:03, спустя 56 минут 20 секунд

    Абырвалг, покажи create table для всех таблиц включая индексы
    show create table `table_name`
    Спустя 157 сек.
    Абырвалг, у тебя в эксплейне у двух таблиц связей не юзаются индексы, возможно типичная ситуация - два столбца a и b образуют PK, если делаешь выборку "where a=… and b=…" - индекс используется, если делаешь "where b=… and a=…" или "where b=…" - не используется

    выход - сделать второй индекс:
    PRIMARY KEY (a,b)
    INDEX (b,a)
    не всё полезно, что в swap полезло
  • AlexB

    Сообщения: 4306 Репутация: N Группа: в ухо

    Spritz 9 февраля 2011 г. 10:22, спустя 18 минут 16 секунд


    выход - сделать второй индекс:
    PRIMARY KEY (a,b)
    INDEX (b,a)
    Не надо второй составной индекс, если нет запросов where b=, если есть нужно чисто по b строить.
    Условия местами в where оптимизатор поменяет сам.
    Первым в составном индексе должно быть наиболее вариабельное поле.
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 9 февраля 2011 г. 10:34, спустя 12 минут 13 секунд

    нужно чисто по b строить

    да, действительно

    Условия местами в where оптимизатор поменяет сам

    если не
    where b=… order by a
    не всё полезно, что в swap полезло
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 9 февраля 2011 г. 10:48, спустя 14 минут 9 секунд

    4) А теперь еще одно условие к прошлой выборке - нужно не все места, а только те, которые я вместе с Ваней посещал

    FROM
      places AS p
      LEFT JOIN places2rides pr ON pr.place_id=p.id
        LEFT JOIN rides2users ru ON ru.place_id=pr.place_id
      LEFT JOIN places2rides pr3 ON pr3.place_id=p.id
        LEFT JOIN rides2users ru3 ON ru3.place_id=pr3.place_id
    WHERE
      ru.user_id = %me% AND ru3.user_id = %ivan%

    я рассуждаю так
    надо найти все места юзера 1, все места юзера 2 и сделать для них пересечение
    т.е. я бы ебанул два отдельных запроса и сделал пхпшный array_intersect
    либо сделал два вложенных запроса: select from (select join join) join (select join join)
    но не каскадный джойн
    не всё полезно, что в swap полезло
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 9 февраля 2011 г. 12:05, спустя 1 час 16 минут 38 секунд

    master, интересное мнение, спасибо. Ебануть запросы отдельно - тоже была такая мысля, просто если общих мероприятий будет 100500 - WHERE IN наверно тоже не шибко быстро сработает?
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 9 февраля 2011 г. 12:09, спустя 4 минуты 19 секунд

    Абырвалг, WHERE IN - это объединение а не пересечение
    не всё полезно, что в swap полезло
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 9 февраля 2011 г. 12:32, спустя 23 минуты 19 секунд

    я имел в виду where place_id in (места 1 участника) and place_id in (места 2 участника)
  • master

    Сообщения: 3244 Репутация: N Группа: Джедаи

    Spritz 9 февраля 2011 г. 13:39, спустя 1 час 6 минут 24 секунды

    Абырвалг, если места известны до помещения в запрос то и сделай им array_intersect
    не всё полезно, что в swap полезло

Пожалуйста, авторизуйтесь, чтобы написать комментарий!