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

Статус
В этой теме нельзя размещать новые ответы.

Monterpan

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

Индекс не будет работать в лайке если начало начинается с символов шаблона % или _.

А для ТС советую выбрать другую архитектуру БД. В конце концов можно тупо сгруппировать определенные артикулы и производить поиск по уже известной группе, будет в разы быстрее.
 
Да действительно, отделить в таблицу артикулы и их ID использовать.
Вид таблицы такой:
- id (primary key, автоинкрементное поле)
- artikul (int(...), ID)
- price
- date
 
Да действительно, отделить в таблицу артикулы и их ID использовать.
Вид таблицы такой:
- id (primary key, автоинкрементное поле)
- artikul (int(...), ID)
- price
- date
я разделил данную таблицу на две:
1)
id
artikul
и
2)
id
все остальные таблицы.
Скорость выросла в среднем с 8.1 секунды на запрос до
2.5 секунды.
Остальные варианты, что я перепробовал (по отдельности и вместе:( уменьшение с varchar(30)
до varchar (19); изменение кодировки до однобайтовой; выставления index. Максимально сокращали время запроса в среднем с 8.1 сек до 7 сек.


Можно ли сделать что-нибудь еще?
 
Можно ли сделать что-нибудь еще?
Можно разнести по разным таблицам. К примеру, название таблицы будет начинаться с первых 3-х символов артикула. Если артикулы скажем в формате 10XXX-XX, то таблицы будут называться 10X. Где X - число/символ.
 
артикул - в индекс.
и попробуйте mysql дать побольше памяти под буфера,
смотреть и читать про файлик /etc/my.cnf
один из буферов:
Код:
[mysqld]
set-variable = key_buffer=256M

после изменения mysql сервер нужно перезапустить.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху