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:
  1. SELECT *   
  2. FROM `content_langs`   
  3. WHERE   
  4.     MATCH (lead) AGAINST ('alma' IN BOOLEAN MODE)  
  5.     OR   
  6.     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:
  1. CREATE TABLE `content_langs` (  
  2.   `id` int(11) NOT NULL auto_increment,  
  3.   `content_id` int(11) NOT NULL default '0',  
  4.   `lang` varchar(2) NOT NULL default '',  
  5.   `uptitle` varchar(255) NOT NULL default '',  
  6.   `title` varchar(255) NOT NULL default '',  
  7.   `subtitle` varchar(255) NOT NULL default '',  
  8.   `shorttitle` varchar(255) NOT NULL default '',  
  9.   `url` varchar(255) NOT NULL default '',  
  10.   `lead` text NOT NULL,  
  11.   `content` text NOT NULL,  
  12.   `modify_date` datetime default '0000-00-00 00:00:00',  
  13.   PRIMARY KEY  (`id`),  
  14.   UNIQUE KEY `content_id` (`content_id`,`lang`),  
  15.   KEY `lang` (`lang`),  
  16.   KEY `url` (`url`),  
  17.   KEY `updatedate` (`modify_date`),  
  18.   FULLTEXT KEY `uptitle` (`uptitle`),  
  19.   FULLTEXT KEY `title` (`title`),  
  20.   FULLTEXT KEY `shorttitle` (`shorttitle`),  
  21.   FULLTEXT KEY `lead` (`lead`),  
  22.   FULLTEXT KEY `content` (`content`)  
  23. ) 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:
  1. SELECT *   
  2. FROM `content_langs`   
  3. WHERE   
  4. MATCH (lead) AGAINST ('alma' IN BOOLEAN MODE)  
  5.   
  6. UNION DISTINCT  
  7.   
  8. SELECT *   
  9. FROM `content_langs`   
  10. WHERE   
  11. MATCH (content) AGAINST ('alma' IN BOOLEAN MODE)  
Avagy a fulltext indexet így módosítani:
  1. FULLTEXT KEY `uj_index` (`lead`,`content`)  
és a lekérdezés már így néz ki:
  1. SELECT *   
  2. FROM `content_langs`   
  3. WHERE   
  4. MATCH (lead,content) AGAINST ('alma' IN BOOLEAN MODE)