我正在使用下面提到的查詢,每個表中大約有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
我正在使用下面提到的查詢,每個表中大約有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
幾乎所有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
創建的關鍵指標,你通常compare..That將減少時間大大
首先你要確定你的表
網址鍵( 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
正在使用比=''更快的length()嗎?如果你有空,會發生什麼?一樣? – haltabush 2012-03-21 07:35:49
@haltabush長度不是更快,但它處理空值 – silly 2012-03-21 07:46:11
然後「(urls.status IS NULL)或(urls.status ='')」應該更快... – user1027167 2012-03-21 08:02:12
首先,你應該更好地使用聯接語法:
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條記錄,我想它仍然有點慢。
不僅創造指數將解決所有的問題。 您可以優化您的表結構並刪除冗餘索引(如果有)。 我使用SQLyog它有'查詢分析器',它會讓你知道你的查詢執行是如何發生的,查詢執行的分步方法(典型佈局將如下所示),還有'計算最佳數據類型'和'查找冗餘索引'可以讓你優化你的表格結構,我希望這個工具能幫助你。 )
請張貼您的表格創建語句! (看看你使用的引擎,你定義了什麼樣的鍵) – silly 2012-03-21 07:29:37