我在一个包含~90 000 000行的表上创建索引。全文搜索必须在名为email
的varchar字段上完成。我还将parent_id
设置为属性。
当我运行查询来搜索匹配少量点击字词的电子邮件时,会立即触发:
mysql> SELECT count(*) FROM users WHERE MATCH('diedsmiling');
+----------+
| count(*) |
+----------+
| 26 |
+----------+
1 row in set (0.00 sec)
mysql> show meta;
+---------------+-------------+
| Variable_name | Value |
+---------------+-------------+
| total | 1 |
| total_found | 1 |
| time | 0.000 |
| keyword[0] | diedsmiling |
| docs[0] | 26 |
| hits[0] | 26 |
+---------------+-------------+
6 rows in set (0.00 sec)
当我搜索匹配大量点击字词的电子邮件时,事情变得复杂了:
mysql> SELECT count(*) FROM users WHERE MATCH('mail');
+----------+
| count(*) |
+----------+
| 33237994 |
+----------+
1 row in set (9.21 sec)
mysql> show meta;
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| total | 1 |
| total_found | 1 |
| time | 9.210 |
| keyword[0] | mail |
| docs[0] | 33237994 |
| hits[0] | 33253762 |
+---------------+----------+
6 rows in set (0.00 sec)
使用parent_id
属性,不会带来任何利润:
mysql> SELECT count(*) FROM users WHERE MATCH('mail') AND parent_id = 62003;
+----------+
| count(*) |
+----------+
| 21404 |
+----------+
1 row in set (8.66 sec)
mysql> show meta;
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| total | 1 |
| total_found | 1 |
| time | 8.666 |
| keyword[0] | mail |
| docs[0] | 33237994 |
| hits[0] | 33253762 |
以下是我的狮身人面像配置:
source src1
{
type = mysql
sql_host = HOST
sql_user = USER
sql_pass = PASS
sql_db = DATABASE
sql_port = 3306 # optional, default is 3306
sql_query = \
SELECT id, parent_id, email \
FROM users
sql_attr_uint = parent_id
}
index test1
{
source = src1
path = /var/lib/sphinx/test1
}
我需要运行的查询如下:
SELECT * FROM users WHERE MATCH('mail') AND parent_id = 62003;
我需要收到与某项工作相匹配的所有电子邮件,并且有一定的parent_id
。
我的问题是: 有没有办法优化上述情况?也许这种类型的查询有更方便的匹配模式?如果我迁移到具有SSD磁盘的服务器,性能增长是否会显着?
答案 0 :(得分:1)
只是为了得到计数可以做到
Select id from index where match(...) limit 0 option ranker=none; show meta;
从total_found获得。
将比调用group by的count [*]更有效。
如果只是单个单词,甚至是call keywords('word','index',1);
。