相关疑难解决方法(0)

为什么在 MySQL 中的 FULLTEXT 索引上 LIKE 比 MATCH...AGAINST 快 4 倍多?

我不明白这个。

我有一个包含这些索引的表

PRIMARY     post_id
INDEX       topic_id
FULLTEXT    post_text
Run Code Online (Sandbox Code Playgroud)

表有(仅)346 000 行。我正在尝试执行 2 个查询。

SELECT post_id 
FROM phpbb_posts 
WHERE topic_id = 144017 
AND post_id != 155352 
AND MATCH(post_text) AGAINST('http://rapidshare.com/files/5494794/photo.rar')
Run Code Online (Sandbox Code Playgroud)

需要 4.05 秒,而

SELECT post_id 
FROM phpbb_posts 
WHERE topic_id=144017 
AND post_id != 155352 
AND post_text LIKE ('%http://rapidshare.com/files/5494794/photo.rar%')
Run Code Online (Sandbox Code Playgroud)

需要 0.027 秒。

EXPLAIN 显示唯一的区别在于可能的键(fulltext包含 post_text,LIKE不包含)

这真的很奇怪。

这背后是什么?后台发生了什么?LIKE不使用索引时怎么会这么快,而使用它的索引时 FULLTEXT怎么会这么慢?

更新1:

实际上现在大约需要 0.5 秒,也许表被锁定了,但是,当我打开分析时,它显示 FULLTEXT INITIALIZATION 花了 0.2 秒。这是怎么回事?

我可以LIKE每秒 10 倍的速度查询我的表格,而全文只有 2 倍

更新2:

惊喜!

mysql> SELECT …
Run Code Online (Sandbox Code Playgroud)

mysql full-text-search

12
推荐指数
1
解决办法
4万
查看次数

在 BOOLEAN MODE 中忽略 FULLTEXT 索引,“字数”有条件

当我添加一些以布尔模式为条件的单词时,全文匹配忽略了它的索引。选择如下:

explain select * from seeds  WHERE  MATCH(text) AGAINST ("mount cameroon" IN BOOLEAN MODE);
Run Code Online (Sandbox Code Playgroud)

产出

+----+-------------+-------+----------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type     | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+----------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | seeds | fulltext | text          | text | 0       |      |    1 | Using where |
+----+-------------+-------+----------+---------------+------+---------+------+------+-------------+
Run Code Online (Sandbox Code Playgroud)

具有多个条件词的相同查询

explain select * from seeds  WHERE  MATCH(text) AGAINST ("mount cameroon" IN BOOLEAN MODE) = 4;
Run Code Online (Sandbox Code Playgroud)

产出

+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id …
Run Code Online (Sandbox Code Playgroud)

mysql full-text-search

6
推荐指数
1
解决办法
2966
查看次数

Mysql全文搜索my.cnf优化

我在https://serverfault.com/questions/353888/mysql-full-text-search-cause-high-usage-cpu 上提出了一个问题一些用户建议在这里提问。

我们建立了一个新闻网站。每天我们都会从web api输入数以万计的数据。

为了提供精准的搜索服务,我们的表使用了MyISAM,建立了全文索引(标题、内容、日期)。我们的网站正在测试 Godaddy VDS,内存为 2GB,空间为 30GB(无交换,因为 VDS 不允许构建交换)。CPU是Intel(R) Xeon(R) CPU L5609 @ 1.87GHz

运行一个 ./mysqltuner.pl

我们得到一些结果:

-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.5.20
[OK] Operating on 32-bit architecture with less than 2GB RAM

-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 396M (Tables: 39)
[--] Data in InnoDB tables: 208K (Tables: 8)
[!!] …
Run Code Online (Sandbox Code Playgroud)

mysql myisam full-text-search my.cnf

5
推荐指数
1
解决办法
9780
查看次数

全文和左连接的慢查询

我有3张桌子

  • 约 250,000 条记录。
  • table1 是 MyISAM,添加带有标题和内容的 fullindex,添加带有 pid 的索引。
  • table2 和 table3 是 InnoDB,用 pid 添加索引。

只查询table3,只需要0.04秒。

select * from table3 
WHERE MATCH (title,content)
AGAINST ('+words' IN BOOLEAN MODE)
ORDER BY pid
Run Code Online (Sandbox Code Playgroud)

但是像这样查询,花费 16.87 秒。

SELECT * 
FROM table1
INNER JOIN table2 ON table1.pid = table2.pid
LEFT JOIN table3 ON table1.pid = table3.pid
WHERE MATCH (table3.title, table3.content)
AGAINST ('+words' IN BOOLEAN MODE)
ORDER BY table3.pid
Run Code Online (Sandbox Code Playgroud)

我为第二个查询制定了一个解释计划,返回:

id select_type  table     type  possible_keys    key    key_len    ref               rows      Extra
1  SIMPLE       table1 …
Run Code Online (Sandbox Code Playgroud)

mysql full-text-search select

5
推荐指数
1
解决办法
7745
查看次数

MySQL全文选择性能

我在一个表中有1.5M行。以下是表创建代码:

CREATE TABLE `jobs` (
    `id` INT(8) NOT NULL AUTO_INCREMENT,
    `job_id` VARCHAR(50) NOT NULL DEFAULT '',
    `title` VARCHAR(255) NOT NULL DEFAULT '',
    `company` VARCHAR(255) NOT NULL DEFAULT '',
    `city` VARCHAR(50) NOT NULL DEFAULT '',
    `state` VARCHAR(50) NOT NULL DEFAULT '',
    PRIMARY KEY (`id`),
    UNIQUE INDEX `job_id` (`job_id`),
    FULLTEXT INDEX `search` (`title`, `company`, `city`, `state`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
Run Code Online (Sandbox Code Playgroud)

下面的查询大约需要0.3秒,这是非常高的。

SELECT id 
     , title 
     , company 
     , state 
     , city 
FROM `jobs` 
WHERE MATCH (title, company, state, city) …
Run Code Online (Sandbox Code Playgroud)

mysql myisam full-text-search wamp

5
推荐指数
1
解决办法
1827
查看次数

标签 统计

full-text-search ×5

mysql ×5

myisam ×2

my.cnf ×1

select ×1

wamp ×1