我的表中有很多行,table_1
。有時我只需要檢索一個特定的行。MySQL中優化的SELECT查詢
我假設,當我用WHERE子句使用SELECT查詢時,它循環遍歷第一行,直到它符合我的要求。
有什麼辦法讓查詢跳轉到特定的行,然後從該行開始?
例子:
假設有5000萬行,我要搜索的ID是53750.我需要的是:搜索可以從50000開始,以便它可以節省時間用於搜索49999行。
因爲我不是SQL專家,所以我不知道確切的術語!
我的表中有很多行,table_1
。有時我只需要檢索一個特定的行。MySQL中優化的SELECT查詢
我假設,當我用WHERE子句使用SELECT查詢時,它循環遍歷第一行,直到它符合我的要求。
有什麼辦法讓查詢跳轉到特定的行,然後從該行開始?
例子:
假設有5000萬行,我要搜索的ID是53750.我需要的是:搜索可以從50000開始,以便它可以節省時間用於搜索49999行。
因爲我不是SQL專家,所以我不知道確切的術語!
我的理解是,要選擇ID爲53750.行如果您有名爲id你可以這樣做一個領域:
SELECT * FROM table_1 WHERE id = 53750
隨着索引ID字段。這是最快的方法。我所知道的。
我相信OP想知道如何在特定的ID處開始查詢,然後向上找到它(也就是說在運行時會找到id),所以我不確定你的答案在這方面真的有幫助。但是,這個指數肯定會讓情況變得更好。 – Lighthart 2013-02-27 07:48:47
我的錯。我誤解了這個問題。 – 2013-02-27 08:05:18
您需要創建一個索引:http://dev.mysql.com/doc/refman/5.1/en/create-index.html
ALTER TABLE_1 ADD UNIQUE INDEX (ID);
ALTER table_1 ADD UNIQUE INDEX (<collumn>)
將是一個偉大的第一步,如果沒有自動生成它。您還可以使用:
EXPLAIN <your query here>
查看哪種查詢在這種情況下效果最好。請注意,如果您想更改where語句(將來的任何地方),但在那裏看到返回值,那麼也可以將索引放在那裏。
創建的列的索引,你想要做的SELECT
上:
CREATE INDEX index_1 ON table_1 (id);
然後,選擇就像你前行。
但是,請閱讀數據庫,數據庫設計和優化。你的問題充滿了錯誤的假設。不要僅僅複製和粘貼我們的答案。受過教育!
關於優化選擇查詢有幾件事要知道,如Range和Where clause優化,文檔是相當豐富的baout這個問題,請閱讀部分:Optimizing SELECT Statements。您評估的列上的Creating an index對性能也非常有幫助。
一個可能的解決方案您可以創建視圖,然後從視圖查詢。這裏是創建視圖的細節,並從視圖中獲得數據
http://www.w3schools.com/sql/sql_view.asp
現在你只拆分巨大的行數爲許多視圖(即行1-10000在一個視圖然後10001-20000另一種觀點)
然後從視圖查詢。
我非常確定,任何對自己有點尊重的SQL數據庫都不會從第一行開始循環以獲取所需的行。但我也不確定他們是如何使它工作的,所以我不能給出確切的答案。
您可以查看WHERE子句中的內容以及表的索引。你有合適的主鍵嗎?就像爲此使用數字數據類型一樣。你有更多列的索引,用於查詢嗎?
安裝數據庫服務器時也有很多concided,比如放置數據和日誌文件的位置,爲服務器提供多少內存以及設置增長。你可以做很多事情來調整你的服務器。
你可以嘗試這個簡單。
query = "SELECT * FROM tblname LIMIT 50000,0
我剛剛用phpmyadmin試了一下。其中「50,000」是查找的起始行。
編輯: 但是,如果我我們是你我不會使用這一個,因爲它會失去1 - 49999記錄搜索。
如果使用ID 53750記錄不在第50,000行之後,但在它之前呢? MySQL不保證記錄的存儲方式。 – 2013-02-27 07:54:16
作爲我編輯它,我不保證你使用那一個。您可以使用二分搜索而不是線性搜索。去谷歌上查詢。 – 2013-02-27 07:56:32
或者讓MySQL執行搜索。如果你已經設計好數據庫,它就會非常好。 – 2013-02-27 07:57:48
你可以嘗試在partitions
More about alter tables to add partitions
Selecting from a specific partition
分割你的表在你的情況,你可以爲每個50.000行創建ID的分區,當你想跳過第一50.000你只需從分區2中選擇。如何做到這一點在MySQL文檔中有很好的解釋。
我認爲你需要做一個索引。在id字段上有一個聚簇索引,你的數據庫引擎將能夠直接進入好記錄而不會循環。 – 2013-02-27 07:45:23
那麼,正如我所說我不是專家,請你詳細說明一下嗎? – 2013-02-27 07:46:02
http://hackmysql.com/case1 – Cris 2013-02-27 07:46:57