ускорение запроса на выборку

Тема в разделе "Базы данных", создана пользователем Monterpan, 17 ноя 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. Monterpan

    Monterpan Постоялец

    Регистр.:
    3 мар 2008
    Сообщения:
    150
    Симпатии:
    27
    Помогите, пожалуйста.
    Есть таблица (ее дамп около 800 мб) с количеством записей около 6 млн.
    Вид таблицы такой:
    - id (primary key, автоинкрементное поле)
    - artikul (varchar(30), уникальные номера)
    - price
    - date
    Я осуществляю поиск по полю artikul ( например, artikul LIKE %2445% )
    и один запрос выполняется около 15 секунд.
    Как можно ускорить данный поиск?
    Используемая БД - mysql, к БД обращаюсь на PHP
     
  2. Greg1978

    Greg1978 Создатель

    Регистр.:
    13 окт 2009
    Сообщения:
    10
    Симпатии:
    1
    LIKE запрос сам по себе слишком пригружает БД, `artikul`='2445', а ещё лучше артикуль если есть возможность привязать к id.
     
  3. Laba

    Laba Создатель

    Регистр.:
    27 сен 2009
    Сообщения:
    18
    Симпатии:
    2
    Если создать индекс на колонку artikul и в запросах не писать первым % - работать будет быстрее
     
  4. Monterpan

    Monterpan Постоялец

    Регистр.:
    3 мар 2008
    Сообщения:
    150
    Симпатии:
    27
    to Greg1978 - а какой запрос, вместо LIKE, будет меньше загружать БД? Артикул нету возможности привязать к ID т.к. в артикуле встречаются цифры и латинские буквы.
    to Laba - нужен поиск по всему тексту артикула. Я не уверен что пользователь будет искать артикулы по начальным символам, поэтому искать без первого % не имеет смысла.
     
  5. .WishMaster.

    .WishMaster. Создатель

    Регистр.:
    15 июл 2009
    Сообщения:
    27
    Симпатии:
    0
    для ускорения, полю по которому идет частый поиск, сделайте индекс.
    Это увеличит объем базы, но позволит производительность производительность.
    Другой вариант, это смена субд.
     
  6. tostrss

    tostrss

    Регистр.:
    16 окт 2007
    Сообщения:
    771
    Симпатии:
    217
    Индекс не будет работать в лайке если начало начинается с символов шаблона % или _.

    А для ТС советую выбрать другую архитектуру БД. В конце концов можно тупо сгруппировать определенные артикулы и производить поиск по уже известной группе, будет в разы быстрее.
     
  7. Greg1978

    Greg1978 Создатель

    Регистр.:
    13 окт 2009
    Сообщения:
    10
    Симпатии:
    1
    Да действительно, отделить в таблицу артикулы и их ID использовать.
    Вид таблицы такой:
    - id (primary key, автоинкрементное поле)
    - artikul (int(...), ID)
    - price
    - date
     
    Monterpan нравится это.
  8. Monterpan

    Monterpan Постоялец

    Регистр.:
    3 мар 2008
    Сообщения:
    150
    Симпатии:
    27
    я разделил данную таблицу на две:
    1)
    id
    artikul
    и
    2)
    id
    все остальные таблицы.
    Скорость выросла в среднем с 8.1 секунды на запрос до
    2.5 секунды.
    Остальные варианты, что я перепробовал (по отдельности и вместе:( уменьшение с varchar(30)
    до varchar (19); изменение кодировки до однобайтовой; выставления index. Максимально сокращали время запроса в среднем с 8.1 сек до 7 сек.


    Можно ли сделать что-нибудь еще?
     
  9. FoxMALDER

    FoxMALDER Постоялец

    Регистр.:
    20 дек 2006
    Сообщения:
    84
    Симпатии:
    13
    Можно разнести по разным таблицам. К примеру, название таблицы будет начинаться с первых 3-х символов артикула. Если артикулы скажем в формате 10XXX-XX, то таблицы будут называться 10X. Где X - число/символ.
     
  10. zerdek

    zerdek

    Регистр.:
    29 ноя 2007
    Сообщения:
    346
    Симпатии:
    50
    артикул - в индекс.
    и попробуйте mysql дать побольше памяти под буфера,
    смотреть и читать про файлик /etc/my.cnf
    один из буферов:
    Код:
    [mysqld]
    set-variable = key_buffer=256M
    
    после изменения mysql сервер нужно перезапустить.
     
    Monterpan нравится это.
Статус темы:
Закрыта.