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

Pablito

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

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

Большое спасибо всем откликнувшимся
 

tony2001

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

Alien

Новичок
да памяти/места ему жалко (имхо), т.к. этот индекс еще ~~95 мег займет.

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

странные хостеры пошли ... у тебя что прав alter table нет?
 

tony2001

TeaM PHPClub
>у тебя что прав alter table нет?
у меня, кстати, тот же вопрос возник.
почему админ решает какими должны быть таблицы?
 

Pablito

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

Спасибо
 

tony2001

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

>может быть в MySQL эта функция еще недоработана???
в продакшен версиях нет "недоработанных" функций.
 

Pablito

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

Спасибо
 

tony2001

TeaM PHPClub
>Я так понимаю, что используя эти индексы, создание поиска существенно упрощается
все правильно понимаешь.
я бы еще предложил, раз уж ты все равно переделываешь, использовать MnoGoSearch для этого.
 

Апельсин

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

Pablito

Новичок
я думал о MnoGoSearch, но к сожалению у провайдера он не установлен и PHP откомпилирован без поддержки функций MnoGoSearch :((
 

Alien

Новичок
>построй индексы и тестируй.

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

Создаваться индекс будет действительно не очень шустро.
 

Pablito

Новичок
После моего письма хостеру, амин сказал, что создаст индексы на выходных, когда база будет наименее нагружена. Я пришел сегодня и глянул 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)

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

Спасибо
 

Pablito

Новичок
В том то и дело, что есть!!! :(
в 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

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

Pablito

Новичок
Вот результат:

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`)

что же, ЧТО ЖЕ ДЕЛАТЬ????
 

Апельсин

Оранжевое создание
нет, неправильно, у тебя НЕСКОЛЬКО полнотекстовых индексов, а ты в запросе указываешь ОДИН составной.
Теперь все ясно?
 

Pablito

Новичок
Ясно, что ошибка нашлась :))) это очень хорошо, но может подскажете как тогда корректно посторить запрос???

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

БОЛЬШОЕ СПАСИБО!!!
 

LEglantier

Guest
Ну, в мане, помнится, рассматривается MATCH (fld1, fld2...) AGAINST ('value')
Но при этом нужен один фуллтекст индекс по нескольким полям, а не на каждое поле по индексу...
 

Pablito

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

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