2013-07-09 84 views
5

是如何工作的,我使用的MySQL 它只有一個表數據庫「數據」17,151257 rows.This表中有一欄。我想打印,其中字符串列包含一個特定的查詢字符串(存儲在「entered_query」變量)的所有的行,所以我用以下:選擇的MySQL查詢優化和限制在MySQL

SELECT DISTINCT * from data WHERE string LIKE '%".$entered_query."%' limit 10

上述查詢作爲明顯被佔用太多的時間來執行。

我已閱讀,可以使用索引,但在這種情況下如何?
我也想過將整個數據分成10個不同的行,然後使用
perl DBI執行10個並行查詢。

現在我以下的問題:

  1. 如何減少執行時間?
  2. 我聽說mysql中的「LIKE」查詢可以避免索引,所以有沒有更好的選擇對上述查詢?
  3. 當我們在MySQL查詢使用限制10,然後用MySQL停止,因爲發現前10個結果或第一它會搜索給定的查詢整個數據則返回前10個結果
+0

我希望'$ entered_query'不包含其名稱所暗示的。否則,這可能是加快你不想要的查詢的一種方法。 – innaM

+0

DISTINCT *應該做什麼,輸入字符串的大小是否有下限? – innaM

+0

@innaM DISTINCT *用於選擇唯一的元組。 $ entered_query包含用戶輸入的在「字符串」列od表「data」中搜索的查詢。 *抱歉選擇令人困惑的例子。 –

回答

7

普通索引能夠儘快執行不會被用來改善該查詢。 MySQL索引是B樹,這意味着它們可以很快找到索引列的前綴。但由於您的LIKE查詢在開始時有%,因此沒有唯一的前綴可供搜索。所以每一行都必須進行掃描以匹配模式。

但是,MySQL也支持全文搜索。這將創建列中所有單詞的索引,並且可以快速找到這些單詞。詳細信息請參見documentation

如果您使用LIMIT 10,只要找到滿足條件的前10行,就會停止掃描。除非你也使用ORDER BY - 那麼它必須找到所有的行,以便它可以在選擇前10行之前對它們進行排序。

+0

謝謝....有什麼爲什麼不使用LIKE實現相同的結果?以及如何將整個數據分成10個不同的行,然後使用perl DBI執行10個並行查詢。 –

+0

我告訴過你如何做到這一點,而不使用LIKE,使用全文搜索。將它拆分爲單獨的查詢可能會有幫助,這取決於您在數據庫服務器上有多少個核心。但瓶頸可能是磁盤,所以它不會有太大的幫助。 – Barmar