Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 全文;标题「;搜索1M行_Mysql_Mysql Management - Fatal编程技术网

Mysql 全文;标题「;搜索1M行

Mysql 全文;标题「;搜索1M行,mysql,mysql-management,Mysql,Mysql Management,有一个3.3GBarticlesMyisam表,其中包含以下字段:id、title、perma、body、date 主键:id 全文索引:标题 它有1110000行。在我这样做之后: SET GLOBAL key_buffer_size = 2000*1024*1024; LOAD INDEX INTO CACHE articles INDEX(title); 我的表现不够好 您可以在下面看到几个示例的执行时间: <9.5381848812103> SELECT SQL_NO_CA

有一个3.3GB
articles
Myisam表,其中包含以下字段:
id、title、perma、body、date
主键:
id
全文索引:
标题

它有1110000行。在我这样做之后:

SET GLOBAL key_buffer_size = 2000*1024*1024; LOAD INDEX INTO CACHE articles INDEX(title);
我的表现不够好

您可以在下面看到几个示例的执行时间:

<9.5381848812103>
SELECT SQL_NO_CACHE perma,title,body, MATCH(title) AGAINST('flowers for children' IN BOOLEAN MODE) AS sort
FROM articles  WHERE MATCH(title) AGAINST('flowers for children' IN BOOLEAN MODE) ORDER BY sort DESC LIMIT 30;

<12.734259843826>
SELECT SQL_NO_CACHE perma,title,body, MATCH(title) AGAINST('how to play basketball' IN BOOLEAN MODE) AS sort
FROM articles  WHERE MATCH(title) AGAINST('how to play basketball' IN BOOLEAN MODE) ORDER BY sort DESC LIMIT 30;

<4.4655818939209>
SELECT SQL_NO_CACHE perma,title,body, MATCH(title) AGAINST('kill a bird and eat it' IN BOOLEAN MODE) AS sort
FROM articles  WHERE MATCH(title) AGAINST('kill a bird and eat it' IN BOOLEAN MODE) ORDER BY sort DESC LIMIT 30;

<16.268588066101>
SELECT SQL_NO_CACHE perma,title,body, MATCH(title) AGAINST('avoid back pain' IN BOOLEAN MODE) AS sort
FROM articles  WHERE MATCH(title) AGAINST('avoid back pain' IN BOOLEAN MODE) ORDER BY sort DESC LIMIT 30;

<12.553371906281>
SELECT SQL_NO_CACHE perma,title,body, MATCH(title) AGAINST('computer' IN BOOLEAN MODE) AS sort
FROM articles  WHERE MATCH(title) AGAINST('computer' IN BOOLEAN MODE) ORDER BY sort DESC LIMIT 30;

选择SQL\u NO\u缓存perma、title、body、MATCH(title)作为排序(BOOLEAN模式下为子对象的花)
从文章中按排序描述限制30匹配(标题)(布尔模式下的“儿童花”)顺序;
选择SQL\u NO\u缓存perma、title、body、MATCH(title)对抗(“如何在布尔模式下打篮球”)作为排序
从比赛(标题)对抗的文章(“如何在布尔模式下打篮球”)排序描述限制30;
选择SQL\u NO\u缓存perma、title、body、MATCH(title)作为排序依据(“在布尔模式下杀死一只鸟并吃掉它”)
从文章中匹配(标题)到(“在布尔模式下杀死一只鸟并吃掉它”)排序描述限制30;
选择SQL\u NO\u缓存perma、title、body、MATCH(title)对(‘在布尔模式下避免背痛’)作为排序
从文章中,按排序描述限制30匹配(标题)(布尔模式下的“避免背痛”)顺序;
选择SQL\u NO\u缓存perma、title、body、MATCH(title)对('computer'在布尔模式下)进行排序
从文章中按排序描述限制30匹配(标题)到(‘布尔模式下的计算机’)顺序;

有什么建议可以提高执行时间吗?

尝试使用默认的“正常模式”而不是“布尔模式”

我不确定您选择“布尔模式”是否有任何特殊原因。我注意到您没有使用“在布尔模式”中提供的任何运算符。此外,由于数据集很大,您不必担心50%的阈值

我之所以这么说,是因为“在正常模式下”也会根据相关性对结果进行排序,而不需要“排序依据”。这是根据MySQL


哦,除非你改变了最小字长,“全文索引”中包含的最短字长是4个字母。因此,除非最小字数已更改,否则“反对(…)”中的“for”将是不必要的。

这是您的第一个查询

SELECT SQL_NO_CACHE perma,title,body,
MATCH(title) AGAINST('flowers for children' IN BOOLEAN MODE) AS sort
FROM articles
WHERE MATCH(title) AGAINST('flowers for children' IN BOOLEAN MODE)
ORDER BY sort DESC LIMIT 30;
您可能需要重构这个

首先,选择键和排序值

SELECT id,MATCH(title) AGAINST ('flowers for children' IN BOOLEAN MODE) sort
FROM articles
WHERE MATCH(title) AGAINST ('flowers for children' IN BOOLEAN MODE);
此查询将生成一个800M临时表

接下来,将其限制为30个最高排序值

SELECT * FROM
(
    SELECT id,MATCH(title) AGAINST ('flowers for children' IN BOOLEAN MODE) sort
    FROM articles
    WHERE MATCH(title) AGAINST ('flowers for children' IN BOOLEAN MODE)
) AA
ORDER BY sort DESC LIMIT 30;
好了,现在是720字节的临时表

最后,
LEFT将这30行加入到
articles
表中

SELECT
    B.perma,B.title,B.body,A.sort
FROM
(
    SELECT * FROM
    (
        SELECT id,MATCH(title) AGAINST ('flowers for children' IN BOOLEAN MODE) sort
        FROM articles
        WHERE MATCH(title) AGAINST ('flowers for children' IN BOOLEAN MODE)
    ) AA
    ORDER BY sort DESC LIMIT 30
) A LEFT JOIN articles B USING (id);

试试看

除了使用像Lucene这样的专用搜索引擎,我没有什么好的建议。没有“ORDER BY”子句的性能如何?没有“ORDER BY”的性能要快得多结果中有多少项?对于我给出的示例,分别是4k、6k、1k、20k、4k。各位!我的问题这么愚蠢吗?如果是的话,我很抱歉,但是我需要更多的帮助!感谢您的努力和帮助,但最后一部分(第4个代码块)给了我一个错误:SQL错误(1146):表'article.b'不存在。article是数据库名称。第三个代码块可以正常工作