我有一个MySQL数据库有成千上万的行。我想在其中一个字段中搜索一个字词,但只在最后的10000行中搜索。搜索整个表格需要很长的时间,而且我所查找的结果不太可能会比最后的10000行更早。有没有办法手艺类似下面的查询:MYSQL - 从表的一部分选择,以减少搜索时间
SELECT body from <last 10000 rows of table> where body like '%searchTerm%'
我有一个MySQL数据库有成千上万的行。我想在其中一个字段中搜索一个字词,但只在最后的10000行中搜索。搜索整个表格需要很长的时间,而且我所查找的结果不太可能会比最后的10000行更早。有没有办法手艺类似下面的查询:MYSQL - 从表的一部分选择,以减少搜索时间
SELECT body from <last 10000 rows of table> where body like '%searchTerm%'
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
由于前导通配符,您的搜索将无法使用索引,因此总是很昂贵。正如您所指出的那样,您可以通过隔离一部分行来避免全表扫描,然后对这些行执行扫描。
根据您的架构和索引,有多种方法可以隔离行的子集。
假设您的表上有一个自动递增主键,可以使用它来选择最近的行并将扫描限制为这些行。如果您的自动增量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%'
是的,你可以使用LIMIT子句中的MySQL,但为了要告诉最后一列是什么,你还必须有一个ORDER子句。
像下面
SELECT `body` FROM (SELECT * FROM `table` ORDER BY `dateOfRelevance` DESC LIMIT 10000) a WHERE `body` LIKE '%searchTerm%'
虽然我不知道MySQL将能够合理利用上body
要回答您的索引问题:不,MySQL无法使用索引来满足具有前导通配符的LIKE查询。 –
的INDEX你可能想看看https://dev.mysql.com/ doc/refman/5.7/en/fulltext-search.html – GurV
简短回答:不,你建议不可能。原因是表中没有明确定义的部分或部分表格拥有1000行。表格中的数据不是有序的,所以您必须首先运行选择查询才能定义“表格的一部分”,然后查询它。这可以使用子查询在一个步骤中完成,或者使用临时表在两个步骤中完成,即使通过视图。但是,如果这样做,搜索甚至放慢搜索速度是很难说的。您将不得不尝试... – arkascha