2017-03-02 85 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查詢。 –