Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Dowolny sposób na wyszukiwanie pełnotekstowe w InnoDB

użyj pełnotekstowej tabeli myisam, aby zaindeksować z powrotem do swoich tabel innodb, na przykład:

Zbuduj swój system za pomocą innodb:

create table users (...) engine=innodb;

create table forums (...) engine=innodb;

create table threads
(
forum_id smallint unsigned not null,
thread_id int unsigned not null default 0,
user_id int unsigned not null,
subject varchar(255) not null, -- gonna want to search this... !!
created_date datetime not null,
next_reply_id int unsigned not null default 0,
view_count int unsigned not null default 0,
primary key (forum_id, thread_id) -- composite clustered PK index
)
engine=innodb;

Teraz tabela wyszukiwania pełnotekstowego, której użyjemy tylko do zindeksowania z powrotem do naszych tabel innodb. Możesz zachować wiersze w tej tabeli za pomocą wyzwalacza lub nocnych aktualizacji wsadowych itp.

create table threads_ft
(
forum_id smallint unsigned not null,
thread_id int unsigned not null default 0,
subject varchar(255) not null,
fulltext (subject), -- fulltext index on subject
primary key (forum_id, thread_id) -- composite non-clustered index 
)
engine=myisam;

Wreszcie procedura składowana wyszukiwania, którą wywołujesz ze swojego php/aplikacji:

drop procedure if exists ft_search_threads;
delimiter #

create procedure ft_search_threads
(
in p_search varchar(255)
)
begin

select
 t.*,
 f.title as forum_title,
 u.username,
 match(tft.subject) against (p_search in boolean mode) as rank
from
 threads_ft tft
inner join threads t on tft.forum_id = t.forum_id and tft.thread_id = t.thread_id
inner join forums f on t.forum_id = f.forum_id
inner join users u on t.user_id = u.user_id
where
 match(tft.subject) against (p_search in boolean mode) 
order by 
 rank desc
limit 100;

end;

call ft_search_threads('+innodb +clustered +index');

Mam nadzieję, że to pomoże :)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problem MySQL z aktualizacją pola DATETIME z formatu ISO 8601

  2. Prosty sposób na obliczenie mediany za pomocą MySQL

  3. mysql_real_escape_string VS dodaje ukośniki

  4. Jak porównać dwie tabele w MySQL?

  5. AKTUALIZACJA PHP MYSQL, jeśli istnieje lub INSERT, jeśli nie?