ugrás a tartalomhoz

MySQL fulltext search boolean mode-ban nem használ index-et...

wiktor · 2005. Okt. 13. (Cs), 13.01
A problémám a következő. Van egy tábla, amiben több mezőre is tettem fulltextes indexet. Elég "nagy" a tábla majdnem 200MB, már az első keresésnél észrevettem, hogy a tíz másodperc az sok lesz egy egyszerű keresésre.

Ez volt a query:

SELECT * 
FROM `content_langs` 
WHERE 
	MATCH (lead) AGAINST ('alma' IN BOOLEAN MODE)
	OR 
	MATCH (content) AGAINST ('alma' IN BOOLEAN MODE)
Megnéztem EXPLAIN-nel.

id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, SIMPLE, content_langs, ALL, NULL, NULL, NULL, NULL, 0, Using where

Megdöbbentő, de nem használ indexet! Kipróbáltam egy nagyon apró módosítást a query-ben, OR helyett AND-et írtam. Újra EXPLAIN.

id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1 | SIMPLE | content_langs | fulltext | lead,content | lead | 0 | 1 | Using where

Láss csodát, működik az index! Kipróbáltam boolean mode nélkül, úgy működik. Egyszerűen nem értem, hogy ez mitől lehet! Lehet, hogy valami bug, vagy én nagyon nem értek valamit a fulltextes keresésben... Gugliztam is épp eleget, nem találtam semmit... :((

Környezet: MySQL 4.1.11-Debian_4sarge2-log, de megnéztem 4.1.14 alatt is, ott is rossz.

A tábla:

CREATE TABLE `content_langs` (
  `id` int(11) NOT NULL auto_increment,
  `content_id` int(11) NOT NULL default '0',
  `lang` varchar(2) NOT NULL default '',
  `uptitle` varchar(255) NOT NULL default '',
  `title` varchar(255) NOT NULL default '',
  `subtitle` varchar(255) NOT NULL default '',
  `shorttitle` varchar(255) NOT NULL default '',
  `url` varchar(255) NOT NULL default '',
  `lead` text NOT NULL,
  `content` text NOT NULL,
  `modify_date` datetime default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `content_id` (`content_id`,`lang`),
  KEY `lang` (`lang`),
  KEY `url` (`url`),
  KEY `updatedate` (`modify_date`),
  FULLTEXT KEY `uptitle` (`uptitle`),
  FULLTEXT KEY `title` (`title`),
  FULLTEXT KEY `shorttitle` (`shorttitle`),
  FULLTEXT KEY `lead` (`lead`),
  FULLTEXT KEY `content` (`content`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='xxx' AUTO_INCREMENT=0;
Ötlet esetleg? :(
 
1

mysql-5.0.13-rc-win32

wiktor · 2005. Okt. 13. (Cs), 16.05
Kipróbáltam mysql-5.0.13-rc-win32 alatt is, de ott is pontosan ugyanezt produkálta... :(
2

bug report

wiktor · 2005. Dec. 19. (H), 15.46
http://bugs.mysql.com/bug.php?id=14037
3

index kinyir

Anonymous · 2005. Dec. 19. (H), 20.37
Szerintem koztudott hogy az OR lelövi az indexet... nem csak MySQL-nel...
4

linkek?

wiktor · 2005. Dec. 21. (Sze), 23.37
Erről tudnál valami linket küldeni?
5

Union-nal esetleg?

Anonymous · 2005. Dec. 22. (Cs), 02.15
Bár ez két lekérdezés uniója, de lehet, hogy gyorsabb:
SELECT * 
FROM `content_langs` 
WHERE 
MATCH (lead) AGAINST ('alma' IN BOOLEAN MODE)

UNION DISTINCT

SELECT * 
FROM `content_langs` 
WHERE 
MATCH (content) AGAINST ('alma' IN BOOLEAN MODE)
Avagy a fulltext indexet így módosítani:
FULLTEXT KEY `uj_index` (`lead`,`content`)
és a lekérdezés már így néz ki:
SELECT * 
FROM `content_langs` 
WHERE 
MATCH (lead,content) AGAINST ('alma' IN BOOLEAN MODE)