2012-03-21 80 views
1

我正在使用下面提到的查詢,每個表中大約有400,000條記錄,大約需要10〜12秒才能顯示結果。有什麼辦法可以讓它更快。如何快速查詢

查詢:

select url_details.title, url_details.summary, url_details.id from urls, 
url_details where urls.status='' AND urls.keyword_id='2791' AND 
url_details.url_id=urls.id 
+0

請張貼您的表格創建語句! (看看你使用的引擎,你定義了什麼樣的鍵) – silly 2012-03-21 07:29:37

回答

0

幾乎所有mysql性能問題的答案都是索引。 如果您知道您將針對所有查詢篩選這三個變量,請添加跨越這三個字段的複雜索引。

http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

如果你不知道哪些索引,就會被過濾,然後添加一個簡單的指數爲每個字段,並依靠MySQL的「指數合併」的優化。

http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html

+0

非常感謝,它幫助了很多。之前的查詢花費了大約8〜12秒,但並沒有降到0.00秒。謝謝大家:) – Prashant 2012-03-27 06:17:45

+0

@Prashant:我對什麼解決了你的問題感興趣。 – bukzor 2012-03-27 15:54:51

+0

添加索引標題和摘要做了工作 – Prashant 2013-04-03 09:01:33

1

創建的關鍵指標,你通常compare..That將減少時間大大

0

首先你要確定你的表

網址鍵( habe用狀態和keyword_id定義索引):

ALTER TABLE `urls` ADD INDEX `index_keyword_status`(`keyword_id`, `status`); 

和urls_details.url_id必須是一個外鍵或索引

您的選擇:

SELECT 
url_details.title, 
url_details.summary, 
url_details.id 
FROM urls 
INNER JOIN url_details 
    ON url_details.url_id=urls.id 
WHERE urls.keyword_id = 279 
    AND LENGTH(urls.status) = 0 
+0

正在使用比=''更快的length()嗎?如果你有空,會發生什麼?一樣? – haltabush 2012-03-21 07:35:49

+0

@haltabush長度不是更快,但它處理空值 – silly 2012-03-21 07:46:11

+0

然後「(urls.status IS NULL)或(urls.status ='')」應該更快... – user1027167 2012-03-21 08:02:12

0

首先,你應該更好地使用聯接語法:

select url_details.title, url_details.summary, url_details.id from urls join urls_details using(url_id) where urls.status='' AND urls.keyword_id='2791' 

你還需要有薩姆urls.status上的索引,url_id和keyword_id。 如果你在每張桌子上有4 000 000條記錄,我想它仍然有點慢。

0

不僅創造指數將解決所有的問題。 您可以優化您的表結構並刪除冗餘索引(如果有)。 我使用SQLyog它有'查詢分析器',它會讓你知道你的查詢執行是如何發生的,查詢執行的分步方法(典型佈局將如下所示),還有'計算最佳數據類型'和'查找冗餘索引'可以讓你優化你的表格結構,我希望這個工具能幫助你。 enter image description here