За последние 24 часа нас посетили 21783 программиста и 1690 роботов. Сейчас ищет 1851 программист ...

Самый быстрой поиска по столбцу с ключевыми словами

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

  1. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Допустим есть таблица keywords, в ней хранятся ключевые слова. Какой запрос будет наиболее быстрым в Mysql?
    P.S. точность поиска не важна, важна скорость, sphinx не предлагать.
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Код (Text):
    1. SELECT * FROM `keywords` WHERE 1 LIMIT 1
    Точность же не важна...
     
  3. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Да, но LIMIT 1 можно убрать :)
    SELECT * FROM `keywords` WHERE keyword='$keyword' - такой запрос будет быстрее чем с LIKE и MATCH AGAINST?
     
  4. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    если строка ТОЧНО совпадает с тем что в в бд тогда да но это не поиск а условие. а поиск это like %text% совпадение с частью строки
     
  5. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Нужны ли индексы для запроса с WHERE, например FULLTEXT и т.д у полей keywords, id?
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Для MATCH AGAINST - обязательно
    --- Добавлено ---
    Для больших проектов Sphinx, ElasticSearch и т.д. Там даже варианты с LIKE или MATCH не рассматриваются. А для маленьких проектов, где в лучше случае поисковой запрос раз в 30 секунд, я не особо парюсь. Впрочем, MATCH предпочтительней, т.к. не по всем строкам бегать будет.
    --- Добавлено ---
    Сейчас попалась страенькая статейка. Можете и оттуда взять инфу для собственной статистики.
     
  7. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Ну а при таком запросе - SELECT id,keyword FROM `keywords` WHERE keyword='$keyword' - индексы вообще не нужны?
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Даже не знаю, как на такой вопрос ответить. Откуда я знаю, можету вас поле keyword с типом TEXT. То о каких индексах может идти речь. Индексы нужны там, где они нужны. Почитайте в документации. Как минимум, можно мониторить медленные запросы
     
  9. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Индексы - это сделка, вы платите увеличением времени записи за скорость чтения, соответственно нужны они лишь там, где эта сделка выгодна. К тому же, наличие индекса само по себе ничего не гарантирует, потому что планировщик может пойти с другого конца запроса и посчитать, что его использование будет дороже, чем простой перебор. Более того, нужно оценивать не только время исполнения запроса, но и его частоту: хитрый и долгий select выполняющийся раз в день, даже ускоренный в 10 раз даст меньше выгоды, чем десяток микросекунд на постоянно исполняющемся запросе, а связанные с ним накладные расходы на запись так вообще уведут пользу в минус. И это если не вдаваться в детали с разными типами индексов, уточняющими условиями, разбивкой на несколько запросов или наоборот, объединеним в один, вложенными select vs join, специфичными для конкретной СУБД особенностями, кэшированием и прочими сопутствующими вещами.

    Короче, если бы существовала универсальная метрика нужно / не нужно, то это бы уже давно добавили на уровне движков БД, а все остальные варианты кроме "быстрого" выпилили. А до тех пор - explain, slow log и теория наше всё )
     
    artoodetoo, nospiou и mahmuzar нравится это.
  10. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    А на varchar нужен индекс?
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.840
    Симпатии:
    652
    Возможен.
     
  12. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    давай уточним на всякий случай: ты собираешся хранить по одному слову в записи или кучу слов сразу?
    --- Добавлено ---
    https://bit.ly/2IE6zHJ - структура для ключевых слов: многие ко многим
     
  13. rs_ssh

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

    С нами с:
    18 янв 2014
    Сообщения:
    220
    Симпатии:
    0
    Уже подготовленные ключевые слова из одного слова и словосочетания из двух слов(редко из трёх). Varchar 50.
     
  14. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.114
    Симпатии:
    1.244
    Адрес:
    там-сям
    это как быть немножко беременным :) если _иногда_ там более одного ключевого слова, это ломает схему.
    мой совет: сделай классически но до конца, чтобы всё работало — словарь слов и таблица связок. и только потом ищи другие варианты. нельзя не изучив нотную грамоту победить в конкурсе пианистов.
    --- Добавлено ---
    для "синонимов" / "вариантов" можно придумать таблицу синонимов. потом.