Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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 使用fulltextindex和其他where条件执行高效查询_Mysql_Indexing_Full Text Search - Fatal编程技术网

Mysql 使用fulltextindex和其他where条件执行高效查询

Mysql 使用fulltextindex和其他where条件执行高效查询,mysql,indexing,full-text-search,Mysql,Indexing,Full Text Search,我的问题如下: 我有一个表mailmessage,其中包含2300万行1年的数据。 以下是此表的重要字段 id bigint msgtimeutc bigint 主题tinytext 正文 要显示的其他一些数据 我在这张表上有一个全文索引: 在邮件正文、主题上创建全文索引邮件\u全文 我需要在msgtimeutc上搜索正文和主题中的文本,并按日期时间缩小范围,如下所示: SELECT M.some_data FROM mailmessage M WHERE M.MSGTIMEUTC >

我的问题如下:

我有一个表mailmessage,其中包含2300万行1年的数据。 以下是此表的重要字段

id bigint msgtimeutc bigint 主题tinytext 正文 要显示的其他一些数据 我在这张表上有一个全文索引: 在邮件正文、主题上创建全文索引邮件\u全文

我需要在msgtimeutc上搜索正文和主题中的文本,并按日期时间缩小范围,如下所示:

SELECT M.some_data  
FROM mailmessage M 
WHERE M.MSGTIMEUTC >= 1343651965 AND M.MSGTIMEUTC <= 1344170365 
AND ( MATCH (M.BODY,M.SUBJECT) AGAINST ('test')); 
但它在mySQL上不存在

其他请求(如下面的2个)也在进行全表扫描

SELECT M.some_data 
FROM mailmessage M 
WHERE 
M.id in ( 
   select m2.id from mailmessage m2 use index(mailmessage_fulltext)
   where (MATCH (m2.BODY,m2.SUBJECT) AGAINST ('test')) 
) 
AND M.MSGTIMEUTC >= 1343651965 AND M.MSGTIMEUTC <= 1344170365;

这两个查询都向我显示了全文中只使用了一个索引

所以我可能会按日期筛选程序行。。。但我更喜欢关于卷的数据库解决方案


有什么想法吗?

从最新的MySQL版本开始,没有办法将全文索引与其他索引结合起来

索引合并不适用于全文索引。我们计划在未来的MySQL版本中扩展它以涵盖这些内容

您可以尝试使用临时表解决您的问题:

CREATE TEMPORARY TABLE my_search 
  (FULLTEXT INDEX mailmessage_fulltext(body,subject))         
SELECT M.some_data  
FROM mailmessage M 
WHERE M.MSGTIMEUTC >= 1343651965 AND M.MSGTIMEUTC <= 1344170365

请记住,对于此解决方案,real table中的全文索引变得完全无用。

您能为第一个查询显示EXPLAIN的结果吗?为第一个查询添加了EXPLAIN结果吗?很好,我有两种情况:如果搜索的单词不常见:全文索引很快,返回几行,很容易通过mySQL或Java按日期过滤,如果搜索词很常见,那么您的解决方案最好先按日期进行限制。我正在研究一个解决方案来猜测,在这种情况下,我可能不得不屏蔽常用词
SELECT M.some_data 
FROM mailmessage M 
WHERE 
M.id in ( 
   select m2.id from mailmessage m2 use index(mailmessage_fulltext)
   where (MATCH (m2.BODY,m2.SUBJECT) AGAINST ('test')) 
) 
AND M.MSGTIMEUTC >= 1343651965 AND M.MSGTIMEUTC <= 1344170365;
SELECT M1.ATTACHMENTCOUNT AS ATCH_COUNT 
FROM mailmessage AS M1 
INNER JOIN mailmessage AS M2 ON M1.id = M2.id 
WHERE (M1.MSGTIMEUTC >= 1343651965 AND M1.MSGTIMEUTC <= 1344170365) 
AND (MATCH (M2.BODY,M2.SUBJECT) AGAINST ('test'))
CREATE TEMPORARY TABLE my_search 
  (FULLTEXT INDEX mailmessage_fulltext(body,subject))         
SELECT M.some_data  
FROM mailmessage M 
WHERE M.MSGTIMEUTC >= 1343651965 AND M.MSGTIMEUTC <= 1344170365
SELECT M.some_data  
FROM my_search M 
WHERE ( MATCH (M.BODY,M.SUBJECT) AGAINST ('test'));