За последние 24 часа нас посетили 59232 программиста и 1831 робот. Сейчас ищут 884 программиста ...

Оптимизация запросов

Тема в разделе "MySQL", создана пользователем armadillo, 18 июл 2007.

  1. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    1)
    PHP:
    1. select * from main
    2. left join t1 on t1.t1_id=main.t1_id
    3. left join t2..
    4. left join t4..
    5. where t1.t1_name like '%".$str."%'
    6. or t2.t2_name like '%".$str."%'
    7. ...
    использует индексы везде, кроме основной таблицы - там перебором.

    Не будет ли быстрее
    [sql]select * from main where t1_id in (select t1_id from t1...) or t2_id in ()[/sql] - тут по идее везде индексы?


    2) Выбрать клиентов и к ним их последний заказ. Заказов может не быть, или быть более одного. Использую следующее извращение:
    PHP:
    1. select * from clients left join t1 t1a on clients.t1_id=t1a.t1_id
    2. left join t1 t1b on clients.t1_id=t1b.t1_id and t1b.date>t1a.date
    3. where ".$where." and t1b.t1_id is null
    Как лучше?
     
  2. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    1. а что нам показывает эксперимент?
     
  3. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    икспириментом я и сам могу ))
    щаз не доберусь громоздить тестовую базу нормального размера, может пока кто-то уже это делал.
    Тем более что в основном сейчас время на тесты есть на целероне под хп, а там от влияния звезд в три раза время легко плавает.
    вместо вложенных запросов можно попробовать
    "(select * from main, t1 where main.t1_id=t1.t1_id and t1.name like '%".$str."%') union (select * from main, t2..."
     
  4. Anonymous

    Anonymous Guest

    armadillo, почитайте про команду EXPLAIN в MySQL
     
  5. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    детсад.
    читал.
    повторяю.
     
  6. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    union=8.40349
    left join=16.34716
    при том, что все равно показывает что не использует индекс в основной таблице.
    Как должен выглядеть [sql]select main.* from main left join t1 on main.t1_id=t1.t1_id where t1.name like '%%'[/sql]?
     
  7. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    хмм, нет, это я там намудрил с отключением части условий.
    a=union, b=left join

    a=8.58573
    b=10.23514

    a=8.97868
    b=8.99736

    a=7.43848
    b=8.63145


    добавляю еще одно хитрож* условие по мейну и t6 (where find_in_set(t6_id,main.t6_list) and t6.name like...). добавляю соотв. union и left join

    a=8.74031
    b=15.5234

    a=9.47412
    b=16.78071

    a=8.63061
    b=17.85402


    любопытно.
     
  8. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    вопрос 3.
    select * from t1 where id in (select t1_id...)
    дает перебор по всему t1 и в цикле повтор вложенного запроса.
    как от этого уйти?
    сейчас под рукой только mysql4, может в пятом не так?
     
  9. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    armadillo
    у вас по-любому будет полный перебор, раз условия начинаются с %
     
  10. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    перебор по таблице где like - естественно. Происходит перебор по основной таблице.
    что касается вопроса 3, то там лайка нет вообще. Дело в конкретном запросе, но я пока от него вообще отказался, потом рассмотрим.
     
  11. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    да нет, не совсем естественно. они [таблицы с like] подключаются по первичному ключу -- отсюда и индекс. посмотрите explain