2017-03-02 82 views
1

我有一个MySQL数据库有成千上万的行。我想在其中一个字段中搜索一个字词,但只在最后的10000行中搜索。搜索整个表格需要很长的时间,而且我所查找的结果不太可能会比最后的10000行更早。有没有办法手艺类似下面的查询:MYSQL - 从表的一部分选择,以减少搜索时间

SELECT body from <last 10000 rows of table> where body like '%searchTerm%' 
+1

的INDEX你可能想看看https://dev.mysql.com/ doc/refman/5.7/en/fulltext-search.html – GurV

+1

简短回答:不,你建议不可能。原因是表中没有明确定义的部分或部分表格拥有1000行。表格中的数据不是有序的,所以您必须首先运行选择查询才能定义“表格的一部分”,然后查询它。这可以使用子查询在一个步骤中完成,或者使用临时表在两个步骤中完成,即使通过视图。但是,如果这样做,搜索甚至放慢搜索速度是很难说的。您将不得不尝试... – arkascha

回答

-2
SELECT body from <last 10000 rows of table> where body like '%searchTerm%' 

,你需要这样的事?

SELECT body from table where body like '%searchTerm%' order by id desc limit 10000 
+2

这将返回其他内容(10k结果,而不是第一个10k的结果),并且仍然会搜索所有行,然后排序,然后仅发送一部分。所以我担心它不会做OP的要求。 – Nanne

+0

@Nanne技术上是正确的(我不明白搜索只有最后10K记录的速度) - >这就像嵌套选择'SELECT身体从(选择身体从表顺序通过id desc限制10000)身体像'%searchTerm%' ' - 谢谢! – Mihai

-1

由于前导通配符,您的搜索将无法使用索引,因此总是很昂贵。正如您所指出的那样,您可以通过隔离一部分行来避免全表扫描,然后对这些行执行扫描。

根据您的架构和索引,有多种方法可以隔离行的子集。

假设您的表上有一个自动递增主键,可以使用它来选择最近的行并将扫描限制为这些行。如果您的自动增量PK在其中存在空白,您是否可以将它限制到10000行是困难的,但这种方法应该可以帮助您开始。

例如:

SELECT body 
from your_table 
where id > (select (max(id) - 10000) from your_table) 
and body like '%searchTerm%' 

如果不工作,你还有其他的方法来隔离行的子集。例如,如果你有一个索引的时间列,你可以用它来搜索最近的记录,例如搜索在过去7天中创建的任何记录:

SELECT body 
from your_table 
where created_at > current_date() - interval 7 day 
and body like '%searchTerm%' 
0

是的,你可以使用LIMIT子句中的MySQL,但为了要告诉最后一列是什么,你还必须有一个ORDER子句。

像下面

SELECT `body` FROM (SELECT * FROM `table` ORDER BY `dateOfRelevance` DESC LIMIT 10000) a WHERE `body` LIKE '%searchTerm%' 

虽然我不知道MySQL将能够合理利用上body

+0

要回答您的索引问题:不,MySQL无法使用索引来满足具有前导通配符的LIKE查询。 –