tropico
Новичок
FULLTEXT поиск (тормоза)
Есть такая таблица:
[sql]
CREATE TABLE `soft` (
`soft_id` char(255) collate utf8_unicode_ci NOT NULL default '',
`cat_id` varchar(30) collate utf8_unicode_ci default NULL,
`subcat_id` varchar(30) collate utf8_unicode_ci NOT NULL default '',
`title` char(255) collate utf8_unicode_ci default NULL,
`version` varchar(20) collate utf8_unicode_ci default NULL,
`pdate` date default NULL,
`description` text collate utf8_unicode_ci,
`short_description` text collate utf8_unicode_ci NOT NULL,
`big_description` mediumtext collate utf8_unicode_ci,
`keywords` char(50) collate utf8_unicode_ci default NULL,
`vendor` char(255) collate utf8_unicode_ci default NULL,
`vendor_id` varchar(50) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`soft_id`),
KEY `title` (`title`),
KEY `vendor_id` (`vendor_id`),
KEY `pdate` (`pdate`),
KEY `keywords_2` (`keywords`),
KEY `subcat_id_idx` (`subcat_id`),
FULLTEXT KEY `keywords` (`keywords`),
FULLTEXT KEY `soft_id` (`soft_id`,`title`,`description`,`short_description`,`keywords`,`vendor`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
[/sql]
Есть запрос к ней вида:
[sql]
select *, MATCH (soft.soft_id, soft.title, soft.description, soft.short_description, soft.keywords, soft.vendor) AGAINST ('"test query"' ) AS score1, MATCH (soft.keywords) AGAINST ('+"test query"' ) AS score2 FROM soft where MATCH (soft.soft_id, soft.title, soft.description, soft.short_description, soft.keywords, soft.vendor) AGAINST ('"test query"' ) order by score1 DESC, score2 DESC LIMIT 10
[/sql]
+ 2 похожих, но по одному FULLTEXT индексу в условии
mysql показывает, что он использует этот индекс:
однако на деле оказывается, что нет. Дикие тормоза, по gstat 100% на чтение всегда. mysql часто пребывает в состоянии biord.
В чем может быть причина?
Стоит еще сказать, что mysql сбрасывет значение cardinality по своему усмотрению
mysqlcheck -a помогаетна 5 минут и то не всегда, потом все снова.
mysql был 4.1.18, 4.1.22, сейчас последний из 5.0 ветки. Проблема наблюдается только с этими fulltext индексами, с остальными все ок.
Еще раз повторю вопрос
В чем может быть причина?
-~{}~ 26.06.07 01:24:
Такой вот простейший тоже тормозит:
[sql]
select *, MATCH (soft.keywords) AGAINST ('+"some query"' ) AS score1, 1=1 AS score2 FROM soft where MATCH (soft.keywords) AGAINST ('+"some query"' ) order by score1 DESC, score2 DESC LIMIT 15
[/sql]
по show processlist видно, что некоторые исполняются по 40-50секунд (хотя некоторые быстро пробегают)
Есть такая таблица:
[sql]
CREATE TABLE `soft` (
`soft_id` char(255) collate utf8_unicode_ci NOT NULL default '',
`cat_id` varchar(30) collate utf8_unicode_ci default NULL,
`subcat_id` varchar(30) collate utf8_unicode_ci NOT NULL default '',
`title` char(255) collate utf8_unicode_ci default NULL,
`version` varchar(20) collate utf8_unicode_ci default NULL,
`pdate` date default NULL,
`description` text collate utf8_unicode_ci,
`short_description` text collate utf8_unicode_ci NOT NULL,
`big_description` mediumtext collate utf8_unicode_ci,
`keywords` char(50) collate utf8_unicode_ci default NULL,
`vendor` char(255) collate utf8_unicode_ci default NULL,
`vendor_id` varchar(50) collate utf8_unicode_ci default NULL,
PRIMARY KEY (`soft_id`),
KEY `title` (`title`),
KEY `vendor_id` (`vendor_id`),
KEY `pdate` (`pdate`),
KEY `keywords_2` (`keywords`),
KEY `subcat_id_idx` (`subcat_id`),
FULLTEXT KEY `keywords` (`keywords`),
FULLTEXT KEY `soft_id` (`soft_id`,`title`,`description`,`short_description`,`keywords`,`vendor`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
[/sql]
Есть запрос к ней вида:
[sql]
select *, MATCH (soft.soft_id, soft.title, soft.description, soft.short_description, soft.keywords, soft.vendor) AGAINST ('"test query"' ) AS score1, MATCH (soft.keywords) AGAINST ('+"test query"' ) AS score2 FROM soft where MATCH (soft.soft_id, soft.title, soft.description, soft.short_description, soft.keywords, soft.vendor) AGAINST ('"test query"' ) order by score1 DESC, score2 DESC LIMIT 10
[/sql]
+ 2 похожих, но по одному FULLTEXT индексу в условии
mysql показывает, что он использует этот индекс:
PHP:
mysql> explain select *, MATCH (soft.soft_id, soft.title, soft.description, soft.short_description, soft.keywords, soft.vendor) AGAINST ('"test query"' ) AS score1, MATCH (soft.keywords) AGAINST ('+"test query"' ) AS score2 FROM soft where MATCH (soft.soft_id, soft.title, soft.description, soft.short_description, soft.keywords, soft.vendor) AGAINST ('"test query"' ) order by score1 DESC, score2 DESC LIMIT 10;
+----+-------------+-------+----------+---------------+---------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+----------+---------------+---------+---------+------+------+-----------------------------+
| 1 | SIMPLE | soft | fulltext | soft_id | soft_id | 0 | | 1 | Using where; Using filesort |
+----+-------------+-------+----------+---------------+---------+---------+------+------+-----------------------------+
1 row in set (0.03 sec)
В чем может быть причина?
Стоит еще сказать, что mysql сбрасывет значение cardinality по своему усмотрению
PHP:
mysql> show index from soft;
+-------+------------+----------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+
| soft | 0 | PRIMARY | 1 | soft_id | A | 44515 | NULL | NULL
....
| soft | 1 | keywords | 1 | keywords | NULL | 1 | NULL | NULL | YES | FULLTEXT | |
| soft | 1 | soft_id | 1 | soft_id | NULL | 1 | NULL | NULL | | FULLTEXT | |
| soft | 1 | soft_id | 2 | title | NULL | 1 | NULL | NULL | YES | FULLTEXT | |
| soft | 1 | soft_id | 3 | description | NULL | 1 | NULL | NULL | YES | FULLTEXT | |
| soft | 1 | soft_id | 4 | short_description | NULL | 1 | NULL | NULL | | FULLTEXT | |
| soft | 1 | soft_id | 5 | keywords | NULL | 1 | NULL | NULL | YES | FULLTEXT | |
| soft | 1 | soft_id | 6 | vendor | NULL | 1 | NULL | NULL | YES | FULLTEXT | |
...
mysql был 4.1.18, 4.1.22, сейчас последний из 5.0 ветки. Проблема наблюдается только с этими fulltext индексами, с остальными все ок.
Еще раз повторю вопрос

В чем может быть причина?
-~{}~ 26.06.07 01:24:
Такой вот простейший тоже тормозит:
[sql]
select *, MATCH (soft.keywords) AGAINST ('+"some query"' ) AS score1, 1=1 AS score2 FROM soft where MATCH (soft.keywords) AGAINST ('+"some query"' ) order by score1 DESC, score2 DESC LIMIT 15
[/sql]
PHP:
mysql> explain select *, MATCH (soft.keywords) AGAINST ('+"some query"' ) AS score1, 1=1 AS score2 FROM soft where MATCH (soft.keywords) AGAINST ('+"some query"' ) order by score1 DESC, score2 DESC LIMIT 15;
+----+-------------+-------+----------+---------------+----------+---------+------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+----------+---------------+----------+---------+------+------+-----------------------------+
| 1 | SIMPLE | soft | fulltext | keywords | keywords | 0 | | 1 | Using where; Using filesort |
+----+-------------+-------+----------+---------------+----------+---------+------+------+-----------------------------+