Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL пълнотекстово търсене в множество колони:резултат объркване

Изглежда, че таблиците на InnoDB не позволяват търсене в няколко пълнотекстови индекса в един и същ MATCH() състояние.

Тук вашите полета не принадлежат на една и съща таблица, поради което са покрити от различни индекси. Забележете, че същото ограничение важи, ако имате таблица като тази:

CREATE TABLE t (
  f1 VARCHAR(20),
  f2 VARCHAR(20),
  FULLTEXT(f1), FULLTEXT(f2)
) ENGINE=InnoDB;

SELECT * FROM t
WHERE MATCH(f1, f2) AGAINST ('something in f2'); -- likely to return no row

Изглежда пълнотекстово търсене може да търси само в първия пълнотекстов индекс, който среща но това е само нещо, което изваждам от този опит , моля, не приемайте това за даденост.

Изводът е, че трябва да разделите търсенето си, така че да използвате един единствен пълнотекстов индекс за MATCH() клауза:

SELECT * FROM auction, user, gallery, ...
WHERE
    MATCH(auction.field1, auction.field2) AGAINST ('search query' IN BOOLEAN MODE) OR
    MATCH(auction.field3) AGAINST ('search query' IN BOOLEAN MODE) OR
    MATCH(user.field1, user.field2, user.field3) AGAINST...

Това е илюстрация на възможна заявка, ако сте имали два различни индекса на auction и един за user . Трябва да го адаптирате към действителната си структура (моля, публикувайте описанията на таблиците си, ако имате нужда от повече насоки).

Забележете, че това се отнася само за таблици InnoDB. Интересното е, че MyISAM таблиците изглежда не показват същото ограничение .

Актуализация:оказва се, че това е бъг в двигателя InnoDB , фиксиран в 5.6.13/5.7.2. Горният пример сега с право се проваля с „Не мога да намеря FULLTEXT индекс, съответстващ на списъка с колони“. Всъщност няма индекс на (f1, f2) , но един на (f1) и още един на (f2) . Както съветва регистърът на промените :

Трябва да се отбележи, че докато такива заявки връщат правилен набор от резултати с MyISAM, те работят по-бавно, отколкото може да се очаква, както те безшумно игнорират съществуващите пълнотекстови индекси .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Резултати в радиус - Оптимизиране на бавна MySQL заявка

  2. MySQL INSERT INTO ... СТОЙНОСТИ и SELECT

  3. Използване на контрол на версиите (Git) на MySQL база данни

  4. MySQL:#126 - Неправилен ключов файл за таблица

  5. Динамична заявка, използваща променлив брой IN (p1, p2, p3) аргументи