За последние 24 часа нас посетили 63186 программистов и 1743 робота. Сейчас ищут 964 программиста ...

Грузит сервер Like запрос

Тема в разделе "PHP и базы данных", создана пользователем rs_ssh, 23 мар 2014.

  1. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Данный запрос очень нагружает процессор(на VPS).
    Тип таблицы: MYISAM
    В архиве 350 тысяч записей(table_archive)

    Запрос выводит похожие товары(актуальные и из архива) учитывая город:

    Код (Text):
    1. $result = mysql_query("
    2. SELECT * FROM `table` WHERE (title LIKE '%$myrow[title]%' OR title LIKE '%$title_2%') AND city IN ($city) AND (id <> '$myrow[id]')
    3. UNION
    4. SELECT * FROM `table_archive` WHERE (title LIKE '%$myrow[title]%' OR title LIKE '%$title_2%') AND city IN ($city) AND (id <> '$myrow[id]') ORDER BY id DESC",$db);
    Может здесь лучше использовать MATCH AGAINST?
     
  2. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Вообще конструкцию LIKE '%искомое%' не рекомендуют, а тут их аж 4 в сложном запросе.
    Спасёт точный поиск LIKE 'искомое' или хотя бы LIKE 'искомое%'
     
  3. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Это да, но тогда похожих товаров будет намного меньше.

    Может индексация title в таблице поможет?
     
  4. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    О, а почему до сих пор не проиндексирован?
     
  5. noganno

    noganno Новичок

    С нами с:
    26 авг 2013
    Сообщения:
    58
    Симпатии:
    0
    Поставь LIMIT, тебе же наверное первые 10-15 товаров надо
     
  6. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    explain и поиск оптимального решения. Там еще есть поля по которым идет поиск может и их надо проиндексировать.
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Почитайте про LIMIT, какая это подлая штука. Лимит отрабатывает в конце выборки, "отсекая" ее по верхней и нижней границе.

    То есть, если у вас результат выборки - тысяча строк, а лимит - с 5й по 10ю, то сначала бд выберет 1000 строк, а потом откинет 4 из начала и 90 из конца. Да, энтропично, но вы же сами попросили "выбрать ВСЕ, что удовлетворяет условию, и показать результаты с такого-то по такой-то, по возможности".
     
  8. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    LIKE '%искомое%' - где то читал что в таких случаях не помогает, или это миф?
    Если помогает, то что лучше FULLTEXT или INDEX?
     
  9. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    explain знаешь для чего придумали?
     
  10. YSandro

    YSandro Старожил

    С нами с:
    7 апр 2011
    Сообщения:
    2.523
    Симпатии:
    2
    Тоже думаю, что не поможет.
    Так ты попробуй. У тебя и записей уже много для замеров времени.
    smitt верно предлагает explain. Нужно сначала разобраться, что там происходит в запросах, где слабое место.


    Также считаю, что при таком количестве записей в принципе не верно использовать LIKE. Лучше бы какую-нибудь систему тегов прикрутить, чтобы искать по ключевым словам.
     
  11. olegkaz

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

    С нами с:
    21 фев 2013
    Сообщения:
    121
    Симпатии:
    0
    так у тебя ведь VPS ставь Sphinx.
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    сфинкс решит все вопросы.