За последние 24 часа нас посетили 60124 программиста и 1744 робота. Сейчас ищут 1116 программистов ...

Оптимизировать запрос, чтобы не вызывал нагрузку

Тема в разделе "PHP и базы данных", создана пользователем justc, 17 окт 2015.

  1. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    Доброго времени суток.

    что-то напортачил я...
    вот такой запрос

    Код (PHP):
    1. SELECT id,headline,alias,date FROM news WHERE (published=NNN AND date <= NNN) AND (nsyujety LIKE SSS AND nsyujety NOT LIKE SSS AND nsyujety NOT LIKE SSS AND nsyujety NOT LIKE SSS AND nsyujety NOT LIKE SSS) ORDER BY date DESC LIMIT NNN,NNN
    он вызывает нагрузку на mysql

    если вместо
    (nsyujety LIKE SSS AND nsyujety NOT LIKE SSS AND nsyujety NOT LIKE SSS AND nsyujety NOT LIKE SSS AND nsyujety NOT LIKE SSS)
    прописать
    (nsyujety LIKE SSS)

    то нагрузка значительно падает
    но в чем разница?

    Добавлено спустя 2 минуты 16 секунд:
    смысл такой
    у новости есть метки (как теги) они могут повторяться их может быть несколько
    мне нужно вывести новость с одной меткой, но исключить 4 другие метки

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    LIKE в принципе тяжеловесный, а тут еще 5 раз идет вызов его O_O
     
  3. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    да, но разница с (nsyujety LIKE SSS)
    раз в 180 где-то

    что как-то не сходится...

    Добавлено спустя 1 минуту 26 секунд:
    как эту задачу решить по-другому? (и не важно LIKE это или как-то по-другому)
     
  4. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    ща только присмотрелся к запросу по внимательнее - просто жжжесть O_O
    расскажи, в чём смысл этой строки -
    Код (PHP):
    1. (nsyujety LIKE SSS AND nsyujety NOT LIKE SSS AND nsyujety NOT LIKE SSS AND nsyujety NOT LIKE SSS AND nsyujety NOT LIKE SSS) ?????????? 
     
  5. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    мне нужно вывести новость с одной меткой, но исключить 4 другие метки
    чисто по запросу
    выбрать новость с nsyujety = Спорт и не равно Еда, Туризм, Рыбалка, Машины
    то есть если у новости две метки Спорт и Еда, то она мимо идет))

    Добавлено спустя 52 секунды:
    я вижу вариант проверить на php? с while ?

    Добавлено спустя 1 минуту 16 секунд:
    или это тоже самое будет?
     
  6. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    мне кажется, это строка просто логически не правильно выражено, то есть, не соответствует твоему представлению
     
  7. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    почему?
    она рабочая, и так как я и написал
    SSS это просто заглушка

    но может можно как-то лучше составить?
    я так понимаю что она грузит mysql подбирая под мой запрос, перебирая каждую новость
    вот отсюда и нагрузки...

    а если на php проверять? но одна проблема сколько ставить в лимит? отдавать все новости это же нагрузку не снизит?
     
  8. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    в инете можно где нить посмотреть данные и протестить этот запрос? ((:)
     
  9. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    как вариант

    то есть будет 20 новостей выбираться
    а на php сделать проверку
    nsyujety != 'Еда' и тд

    а если в этих 20 не найдено, проверить следующие 20

    или даже по 10
     
  10. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
  11. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    так, а не проще это же условие указать в запросе, чем гонять еще через php?
     
  12. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    эм, разговор по кругу))) я условия хочу вынеси из SQL для того чтобы снизить нагрузку

    не пользовался этим сервисом никогда... как бы разобраться что ему надо))
    а для чего структура ?
     
  13. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    в его случае проще наверное использовать FULLTEXT или меня структуру БД.
    ну или вообще ставить сфинкса
     
  14. p@R@dox 55RU

    p@R@dox 55RU Зэк
    [ БАН ]

    С нами с:
    21 май 2014
    Сообщения:
    1.358
    Симпатии:
    7
    Адрес:
    с планеты Ялмез
    как раз вот для таких моментов (((:)

    Добавлено спустя 1 минуту 12 секунд:
    VLK, все возможно... Как все покажет, там уже и виднее будет (((:)
     
  15. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    в левую часть вставляешь SQL запрос на создание таблицы, так же туда же вставляешь запросы на добавление записей в эту таблицу, для теста.
    потом жмешь "Build Schema", и уже в правом окне можно выполнять запросы на получение данных из таблицы (SELECT)

    потом копируешь полученную ссылку, даешь ее сюда, мы можем заходить, видеть как у тебя там и что организовано.
     
  16. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    таблица news там поле nsyujety varchar
     
  17. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    схему пожалуйста, а не что там, мы на схеме все увидим.
     
  18. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    менять структуру это если только запрос с такой же логикой и новой структурой будет меньше грузить, в чем я сомневаюсь ибо логика та же перебирать новости соответствующие условиям и когда условие выполнено - выводить.
    нагрузка это время в секундах, на хостинге, поэтому тут либо переезжать на vps либо делать на php проверку

    Добавлено спустя 14 минут 54 секунды:
    VLK, схему сделаю, попозже
    скажите, а на время выполнение/нагрузку влияет количество полей? ну там SELECT поле1,поле2,поле3....
    и допустим если поле id это цифра то text это большой текст, это же все влияет ?
    и количество условий тоже влияет? WHERE ...
     
  19. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    количество получаемых полей не влияет, а вот по чему искать по цифре или по тексту влияет, по цифрам куда быстрее.
    количество условий тоже влияет.

    набери в поисковике "mysql много like оптимизация запроса" или "mysql много where оптимизация запроса" или как то так, может поможет.
    скорее всего тебе поможет FULLTEXT, но нужно видеть таблицу, по чему именно осуществляется поиск и как именно, потому что рассуждать не пойми о чем очень сложно.
     
  20. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    justc опиши задачу чуть подробнее и по пунктам, чтобы там были все нужные условия, так будет проще понятно как переделать структуру на более оптимизированную
     
  21. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    justc
    Приведите реальный вариант запроса, а не болванку, тогда получите реальную помощь.

    Добавлено спустя 1 минуту 55 секунд:
    upd
    Хм, что-то я не обратил внимания что ТС уже "свалил". :( Бывает...
     
  22. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ну вот не все такие умные как ты. в 70х годах изобрели РСУБД и язык SQL и успешно решали задачи с миллионами записей на очень скромном железе.
    конкретно поисковые теги делают не через тупой перебор, а через связи многие-ко-многим.
    https://www.google.ru/search?q=sql+tags+many+to+many+relationship

    Добавлено спустя 5 минут 54 секунды:
    Вот конкретно пример многие ко многим и условием типа "не входит"
    http://www.mysqldiary.com/a-many-to-many-relationship-table ... n-problem/
     
  23. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    теги делаются через две таблицы в плюс к той, что есть:
    1. сущности, допустим объявления
    2. теги, всякие разные, без указания какой где и что
    3. таблица связей в два поля: номер объявы + номер тега

    Называется, как сказал Андрей, многие ко многим.

    А то вы сделали, хотя вам говорил так не делать, - это называется говно.