Mysql 使用fulltextindex和其他where条件执行高效查询
我的问题如下: 我有一个表mailmessage,其中包含2300万行1年的数据。 以下是此表的重要字段 id bigint msgtimeutc bigint 主题tinytext 正文 要显示的其他一些数据 我在这张表上有一个全文索引: 在邮件正文、主题上创建全文索引邮件\u全文 我需要在msgtimeutc上搜索正文和主题中的文本,并按日期时间缩小范围,如下所示: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 >
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'));