2010-03-04 57 views
3

我有超過10,000,000行的數據庫。現在查詢它可能需要幾秒鐘才能找到一些基本信息。這是不可取的,我知道優化的最佳方法是儘量減少可能的行數,但現在我沒有時間去做這件事。PHP和MySQL:優化數據庫

什麼是最簡單的方法來優化MySQL數據庫,以便查詢時,所用的時間很短?

我不介意數據庫的大小,這並不重要,所以任何增加大小的優化都可以。我對優化不太擅長,現在我已經建立了索引,但我不確定我能從那裏得到多少好處。

我最終會適當減磅數據庫,但有一個快速的治標不治本?

+0

也許問題是查詢...也許這是服務器硬件不夠porwerful,我認爲我們需要更多的信息。 – 2010-03-04 17:57:23

+0

有沒有辦法改進簡單的select查詢?查詢字面上是「SELECT * FROM table WHERE column =」something「」。硬件方面,也許,但服務器沒有運行在最大容量下,所以我不確定是否是這樣,雖然明顯更好的硬件會更好:-D – sam 2010-03-04 18:09:39

+0

在您的查詢中使用EXPLAIN來了解它們如何由您的數據庫執行服務器。有了這些信息,你可以創建你需要的索引。 10M記錄不是那麼多,不應該給一個嚴重的問題。除非它們每個都是1GB ......) – 2010-03-04 18:52:23

回答

2

除了已經建議的索引之外,如果分區表很大,您可能還想查看它們。

Partitioning in MySQL

這很難具體在這裏,因爲我們有非常有限的信息,但分區沿着正確的索引可以走很遠的路。正確編制索引可能是一個長期的主題,但從一般意義上講,您需要索引您查詢的列。

例如,假設您有員工表,並且您有常用的SSN,FNAME,LNAME列。除了這些列之外,我們還會說在表格中還有10列。

現在你有這個疑問:

SELECT FNAME, LNAME FROM EMPLOYEES WHERE SSN = 'blah'; 

忽略的事實SSN有可能成爲主鍵在這裏,可能已經有一個唯一的指標,你可能會看到一個性能優勢通過創建另一個包含列(SSN,FNAME,LNAME)的組合索引。這是有益的原因是因爲數據庫可以通過查看組合索引來滿足此查詢,因爲它包含排序和緊湊空間中所需的所有值。 (即更少的I/O)。即使SSN上的索引只是更好的全表掃描訪問方法,數據庫仍然必須讀取索引(I/O)的數據塊,找到將包含指向記錄的指針的值需要滿足查詢,那麼將需要讀取不同的數據塊(讀取:更多的隨機I/O),以便檢索fname和lname的實際值。

這顯然是非常簡單的,但以這種方式使用索引可以大大減少I/O並提高數據庫的性能。這裏

一些其他環節可能對您有用:

1

上的列索引您搜索的非常頻繁。

+0

已經這樣做!有沒有特定的方法可以做到「更好」?現在我有索引最活躍的搜索列(例如:WHERE x = y,其中x是我編入索引的列)。 – sam 2010-03-04 18:01:25

0

您的查詢是否使用索引?在選擇的查詢上運行EXPLAIN會告訴你什麼?

第一(和最簡單的)一步將確保您的查詢優化。

+0

我剛剛運行了「ANALYZE TABLE」來找出更多信息,但在基本查詢中解釋如下:http://pastebin.com/MfNEiqBy – sam 2010-03-04 18:02:19

1

在你的榜樣,「WHERE x = y',如果y是列名,則也用y創建一個索引。

帶索引的鍵是你的select查詢的結果數應該比整個表大約3%〜5%,它會更快。

另外archieving表的幫助。我不知道如何做到這一點,主要是DBA的任務。 對於DBA來說,如果他們一直在做這件事,那麼這很簡單。

2

正如我所看到的,你從數據庫中請求40k行,這個數據負載需要時間才能被傳輸。

此外,從來不問「如何改善一般」。沒有「一般」優化的方法。優化總是對您的特定情況進行分析和研究的結果。

1

如果您要進行排序或複雜的查詢,您可能需要使用多列索引。例如,如果您正在搜索x.name ='y'或x.phone ='z'的地方,可能需要在名稱,電話上添加索引。簡單的例子,但如果你需要這樣做,你需要進一步研究:)