индексы FULLTEXT для большой таблицы !??

  • Автор темы Автор темы Pablito
  • Дата начала Дата начала

Pablito

Новичок
индексы FULLTEXT для большой таблицы !??

Прочитав статью http://www.mysql.com/doc/ru/Fulltext_Search.html
решил попробовать сделать полнотекстовый поиск по сайту, все основные данные храняться в одной большой таблице MySQL. В таблице около 11 000 записей и она занимает порядка 95 Мб, не знаю, много это или мало, но админ базы у хостинг-провайдера, на мою просьбу добавить индексы FULLTEXT ответил: "при ваших объемах данных это не ускорит запросы, а может сильно замедлить... (такие индексы нужны только в особых случаях) поэтому просьба описать - зачем они вам нужны?"
Хочу спросить, так ли это, и стоит ли организовывать поиск именно таким образом, для такой таблицы????

Большое спасибо всем откликнувшимся
 
>при ваших объемах данных это не ускорит запросы, а может сильно замедлить...
просьба описать почему он так считает.
единственную проблему я вижу только в том, что индексироваться может очень долго, но то, что ускорение (при ПРАВИЛЬНЫХ) запросах будет заметно - уверен.
 
да памяти/места ему жалко (имхо), т.к. этот индекс еще ~~95 мег займет.

>на мою просьбу добавить индексы FULLTEXT

странные хостеры пошли ... у тебя что прав alter table нет?
 
>у тебя что прав alter table нет?
у меня, кстати, тот же вопрос возник.
почему админ решает какими должны быть таблицы?
 
Спасибо, что откликнулись!
Права то есть, но поскольку я подозревал, что в момент создания индекса, может возникнуть большая нагрузка на базу, решил согласовать это вопрос с админом. После его ответа, я задумался о целесообразности и решил спросить у профессионалов. Хотелось бы узнать, у имеющих такой опыт, насколько это эффективно, может быть в MySQL эта функция еще недоработана???

Спасибо
 
>Хотелось бы узнать, у имеющих такой опыт, насколько это эффективно,
сказать "все будет работать в 3.646 раза быстрее" тебе никто не сможет.
сделай маленькую таблицу такую же, построй индексы и тестируй.

>может быть в MySQL эта функция еще недоработана???
в продакшен версиях нет "недоработанных" функций.
 
дело в том, что поиск по сайту (все данные хранятся в MySQL) был сделан не мной, давно, и вызывает огромное количество нареканий (но FULLTEXT не использовали). Сейчас встал вопрос о переделке поиска и я решил, что стоит попробовать переложить эту функцию на MySQL, коль в нем есть такая встроенная функция.
Поэтому меня интересует не вопрос, будет ли оно работать быстрее, а не станут ли SELECTы медленнее, при том, что с этими индексами можно сделать более эфективный поиск.
Я так понимаю, что используя эти индексы, создание поиска существенно упрощается

Спасибо
 
>Я так понимаю, что используя эти индексы, создание поиска существенно упрощается
все правильно понимаешь.
я бы еще предложил, раз уж ты все равно переделываешь, использовать MnoGoSearch для этого.
 
> сделай маленькую таблицу такую же, построй индексы и тестируй.
это не покатит ..
Эффективность использования полнотекстового индекса повышается при увеличении таблицы. Когда-то в списке рассылки пробегало сообщение от Сергея Голубчика (разработчика полнотекстового поиска) по поводу эффективности его использования, но деталей я не помню, а искать сейчас его в архиве времени нет :(
 
я думал о MnoGoSearch, но к сожалению у провайдера он не установлен и PHP откомпилирован без поддержки функций MnoGoSearch :((
 
>построй индексы и тестируй.

Не хочешь зря напрягать провайдера - на отладочном сервере создай и погоняй - стали селекты быстрей... или не стали.

Создаваться индекс будет действительно не очень шустро.
 
После моего письма хостеру, амин сказал, что создаст индексы на выходных, когда база будет наименее нагружена. Я пришел сегодня и глянул phpMyAdminom, действительно есть. Однако я столкнулся с новой проблемой, на мой запрос:
SELECT ID, HEADLINE, ARBODY, SUBHEAD FROM ARTICLES WHERE MATCH (HEADLINE, ARBODY, SUBHEAD) AGAINST('налог') LIMIT 0, 30
Мне выдается: MySQL Error: 1191 (Can't find FULLTEXT index matching the column list)

Что это может быть, может запрос составлен не правильно??? Какими способами можно прояснить ситуацию??? Подскажите!!!

Спасибо
 
В том то и дело, что есть!!! :(
в phpMyAdmine это выглядит так:

PRIMARY Yes ID
ID Yes ID
ID_2 No ID
ARTICLE_BY_ISSUE_AND_CATEGORY No ID_ISSUEABS
ARTICLE_BY_ISSUE_AND_CATEGORY No CATEGORYREF HEADLINE No HEADLINE
ARBODY No ARBODY
SUBHEAD No SUBHEAD

а каким образом еще проверить/посмотреть я не знаю :(((
 
show create table table_name

Выведет тебе всю информацию по структуре таблицы. Посмотри по каким полям у тебя создан полнотекстовый индекс.
 
Вот результат:

CREATE TABLE `ARTICLES` (
`ID` int(11) NOT NULL auto_increment,
`HEADLINE` varchar(200) NOT NULL default '',
`ARBODY` longtext,
`SUBHEAD` mediumtext,
`TYPE` tinyint(1) default '0',
`IMAGESIGN` varchar(200) default NULL,
`CATEGORYREF` int(10) unsigned default NULL,
`IMAGEREF` int(10) unsigned default '0',
`ID_ISSUENUM` int(10) unsigned default '0',
`ID_ISSUEABS` int(10) unsigned default '0',
`ID_ISSUEDATE` date default NULL,
`SUBCATEGORYREF` int(10) unsigned default '0',
`AUTHOREF1` int(10) unsigned default '0',
`AUTHOREF2` int(10) unsigned default '0',
`AUTHOREF3` int(10) unsigned default '0',
`ID_LEVEL` int(10) unsigned default '0',
`ID_PRIOR` int(10) unsigned default '0',
`SUBCATEGORY` varchar(100) default NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `ID` (`ID`),
KEY `ID_2` (`ID`),
KEY `ARTICLE_BY_ISSUE_AND_CATEGORY` (`ID_ISSUEABS`,`CATEGORYREF`),
FULLTEXT KEY `HEADLINE` (`HEADLINE`),
FULLTEXT KEY `ARBODY` (`ARBODY`),
FULLTEXT KEY `SUBHEAD` (`SUBHEAD`)
) TYPE=MyISAM

и насколько я могу понять, все правильно:
FULLTEXT KEY `HEADLINE` (`HEADLINE`),
FULLTEXT KEY `ARBODY` (`ARBODY`),
FULLTEXT KEY `SUBHEAD` (`SUBHEAD`)

что же, ЧТО ЖЕ ДЕЛАТЬ????
 
нет, неправильно, у тебя НЕСКОЛЬКО полнотекстовых индексов, а ты в запросе указываешь ОДИН составной.
Теперь все ясно?
 
Ясно, что ошибка нашлась :))) это очень хорошо, но может подскажете как тогда корректно посторить запрос???

может так:
SELECT ID, HEADLINE, ARBODY, SUBHEAD FROM ARTICLES WHERE MATCH (HEADLINE) AGAINST('налог') OR MATCH (ARBODY) AGAINST('налог') OR MATCH (SUBHEAD) AGAINST('налог') LIMIT 0, 30

БОЛЬШОЕ СПАСИБО!!!
 
Ну, в мане, помнится, рассматривается MATCH (fld1, fld2...) AGAINST ('value')
Но при этом нужен один фуллтекст индекс по нескольким полям, а не на каждое поле по индексу...
 
БОЛЬШОЕ СПАСИБО ВСЕМ откликнувшимся, вы действительно очень помогли, кое-что уже работеат :))) запрос выполняется и выдает результат!!! буду дальше пробовать и экспериментировать

еще раз спасибо :))
 
Сверху