2012-06-28 148 views
1

我有兩個表,其中一個匹配評級的id,其中一個id爲15個實際數據的id。在數據表中,id列有一個索引,並且在收視表中,id是主鍵,並且評級被索引。我想選擇數據,但只能從具有正評級的行中選擇數據。這樣做,我使用的查詢MYSQL需要一個更快的查詢

SELECT * FROM data_table 
    INNER JOIN rating_table ON data_table.id = rating_table.id 
    WHERE rating > 0 

但由於某種原因,這是服用約0.35秒,這似乎很長我。數據表中大約有90,000行,評級表中大約有5000行,這需要比甚至十分之一秒還要少得多......我如何以不同的方式進行索引或以不同的方式進行查詢以加快此任務的速度?

編輯: 分析後,它給了我以下。請注意,我認爲這是緩存,以便查詢回來的速度遠遠超過以前,但即使如此,這可能是有人

0.000012 starting 
0.000053 checking query cache for query  
0.000014 Opening tables  
0.000006 System lock  
0.000027 Table lock  
0.000044 init 
0.000018 optimizing  
0.000060 statistics  
0.000016 preparing 
0.000004 executing 
0.004916 Sending data 
0.000007 end  
0.000003 query end 
0.002271 freeing items 
0.000009 storing result in query cache 
0.000002 logging slow query  
0.000004 cleaning up  

讓我看到了很多的時間用在發送數據花在有用的......怎麼能我加速這部分?

+2

三個問題:1)相同數據類型的'data_table.id'和'rating_table.id'是否相同? 2)除了索引'id'字段,你是否也編制了'rating'的索引? 3)你是否對該陳述進行了簡要分析,以確定持續時間是否不是由其他事情引起的(如將數據發送回客戶端)? – Bjoern

+0

創建索引。這將大大提高查詢響應時間。 –

+0

是的,我在問題中說過評分已經有一個索引,兩個表中的ID都是相同的數據類型。我現在在php myadmin中運行這個,所以這個時間實際上是在mysql中使用的。你也是什麼意思的查詢計劃? – hackartist

回答

3

沒有確切的解決方案給你的問題,但一些建議沒有看到實際的表結構:正確地配置您的查詢。

MySQL有一個inbuild分析器,它可以讓你查看非常詳細的查詢部分查詢花了多少時間。

在你的情況,請按照下列步驟操作:

(1)執行查詢。

(2)找出了分析與查詢ID:

SHOW PROFILES; 

它會回報你是這樣的:

Query_ID | Duration | Query 
---------+-----------+----------------------- 
    2  | 0.0006200 | SHOW STATUS 
    3  | 0.3600000 | (your query here) 
    ... | ...  | ... 

現在你知道查詢ID爲(3)。

(3)查詢查詢。

SHOW PROFILE FOR QUERY 3; // example 

這將返回你的細節,這可能是這樣的:

Status       | Duration 
--------------------------------+------------------- 
starting      | 0.000010 
checking query cache for query | 0.000078 
Opening tables     | 0.000051 
System lock      | 0.000003 
Table lock      | 0.000008 
init       | 0.000036 
optimizing      | 0.000020 
statistics      | 0.000013 
preparing      | 0.000015 
Creating tmp table    | 0.000028 
executing      | 0.000602 
Copying to tmp table   | 0.000176 
Sorting result     | 0.000043 
Sending data     | 0.080032 
end        | 0.000004 
removing tmp table    | 0.000024 
end        | 0.000006 
query end      | 0.000003 
freeing items     | 0.000148 
removing tmp table    | 0.000019 
closing tables     | 0.000005 
logging slow query    | 0.000003 
cleaning up      | 0.000004 

在這個例子中,大部分的時間花在實際上從服務器發送數據返回給客戶端。

如果你已經這樣做了,也許更新你的問題來顯示結果。也可以添加數據結構。

+0

好吧我剛剛發佈了結果,但我認爲它被緩存了,因爲這次它回來得快得多。它仍然可能是有用的。謝謝你告訴我這件事我之前從未使用過輪廓儀。 – hackartist

+0

請在執行查詢之前重置查詢緩存,否則我們只會看到它從緩存中收到數據:'RESET QUERY CACHE;' – Bjoern

+2

@hackartist,請記住'發送數據'實際上非常具有欺騙性。這不僅僅是將數據發送給客戶的時間。從閱讀第一行開始直到完成將最後一行發送給客戶端。換句話說,將數據發送到客戶端所花費的時間**可以小於該值的1%。 – Adi