2012-01-30 52 views
3

我只是wounder是否會有大的性能差異白衣這2個查詢SQL查詢性能LIKE和wildecards主場迎戰

SELECT 
    `items_id`, `sport_id`, `sport`, `title`, `url`, 
    `Select3`, `Select6`, `id`, `data`,`image` as image, 
    concat('index.php?option=sports&item=',`items_id`,'&p=C108-M108') as count_url 
FROM 
    qy9zh_dataitems 
WHERE Select6 LIKE '%sport%' 
ORDER BY `Select9` DESC LIMIT 0, 4 


SELECT 
    `items_id`, `sport_id`, `sport`, `title`, `url`, 
    `Select3`, `Select6`, `id`, `data`,`image` as image, 
    concat('index.php?option=sports&item=',`items_id`,'&p=C108-M108') as count_url 
FROM 
    qy9zh_dataitems 
WHERE Select6 in ('sport') 
ORDER BY `Select9` DESC LIMIT 0, 4 

的查詢工作就好了..他們兩個..只是擔心性能:)

編輯:一件奇怪的事,當我做了一些測試是這樣的:

SELECT * FROM qy9zh_dataitems WHERE Select6 in ('kvinna') LIMIT 0, 40000 

29051總計,查詢花費0.2581秒

SELECT * FROM qy9zh_dataitems WHERE Select6 LIKE ('%kvinna%') LIMIT 0, 40000 

29113總計,查詢花費0.2218秒

+3

你知道這兩個查詢有不同的結果嗎? – danihp 2012-01-30 21:34:14

+0

結果不是問題..只是對性能好奇:) – Mackelito 2012-01-30 21:36:43

+3

殺性能問題是第一個查詢中的起始通配符。 – danihp 2012-01-30 21:39:04

回答

5

如果索引列上定義的,你是在

name LIKE 'Jo%' 

尋找這列開始的指數可以用來加快查詢。但是,如果您正在查找字詞的任何部分,如

name LIKE '%man%' 

該索引無法使用。

IN子句通常非常快,但我不知道它是否可以利用索引。

查詢的速度取決於適當索引的可用性,表的大小,值的分佈(具有相同值的許多行,具有不同值的每行)以及當然在查詢自己。我認爲你的問題不能一概而論。做測試和比較!

3

這些都不甚至接近是相同的查詢,並因此表現無法相比。

第二個查詢可以使用Select6索引限制行那些等於sport,而首先要看看每一行,看它是否包含sportSelect6內容的任何地方。你正試圖比較蘋果和橘子。

+0

對不起。我不是後端/數據庫的傢伙..只是一個簡單的前端開發;)有什麼辦法可以在第一個查詢中使用索引? 我的問題是,第二個讓我使用通配符:/ – Mackelito 2012-01-30 21:43:29

+0

不,你不能在開始時使用'LIKE'和通配符來使用索引。想一想純文本的含義:「給我所有Select6開始的行都是0或者更多的字符,然後包含'sport'這個單詞,然後在它後面有任何東西(或者什麼也沒有)。」由於一場比賽可能是'運動' ,或者「abracadabara體育就像魔術一樣」,索引無法幫助搜索。如果你可以在開始時將它限制在一個特定的詞上('LIKE'sport%''),索引可以有所幫助(儘管沒有這樣的索引可以稍微快一些,因爲服務器可以限制行)。 – 2012-01-30 21:50:38

2

這些是非常不同的標準。

WHERE Select6 LIKE '%sport%' 

將查找select6包含單詞sport的情況。

WHERE Select6 in ('sport') 

將尋找select6是單詞sport的情況。

IN條件允許您指定可能值的列表,並且應該非常快速(如果您已將該字段編入索引)。一個喜歡,尤其是像在字符串中任何位置尋找單詞的人都很難索引。 Where select6 like 'sport%'會尋找select6以sport開頭並且可以索引的情況。

1

與其他人一樣,基本索引不能用於具有領先通配符的搜索。如果您認爲這些查詢將是最常見的,那麼您需要查看MySQL中的全文搜索功能。

全文搜索提供了一種基於文本中的單詞查找記錄的有效方法。但即使這樣也會有侷限性(例如,搜索單詞「port」不一定會返回像「sport」這樣的記錄)。

MySQL Full Text Search