Sphinx查询花费了太多时间

时间:2015-12-25 15:05:41

标签: sphinx

我在一个包含~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磁盘的服务器,性能增长是否会显着?

1 个答案:

答案 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);