2010-10-29 127 views
1

我有這些表結構,雖然它的工作,使用某些SQL查詢EXPLAIN給'使用臨時;在其中一個表上使用「filesort」。一旦表填充了數千個數據,這可能會妨礙性能。以下是該系統的表格結構和解釋。優化MySQL表結構。需要建議

CREATE TABLE IF NOT EXISTS `jobapp` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `fullname` varchar(50) NOT NULL, 
    `icno` varchar(14) NOT NULL, 
    `status` tinyint(1) NOT NULL DEFAULT '1', 
    `timestamp` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `icno` (`icno`) 
) ENGINE=MyISAM; 

CREATE TABLE IF NOT EXISTS `jobapplied` (
    `appid` int(11) NOT NULL, 
    `jid` int(11) NOT NULL, 
    `jobstatus` tinyint(1) NOT NULL, 
    `timestamp` int(10) NOT NULL, 
    KEY `jid` (`jid`), 
    KEY `appid` (`appid`) 
) ENGINE=MyISAM; 

查詢我想這給上述聲明:

EXPLAIN SELECT japp.id, japp.fullname, japp.icno, japp.status, japped.jid, japped.jobstatus 
FROM jobapp AS japp 
INNER JOIN jobapplied AS japped ON japp.id = japped.appid 
WHERE japped.jid = '85' 
AND japped.jobstatus = '2' 
AND japp.status = '2' 
ORDER BY japp.`timestamp` DESC 

該系統是招募新員工。一旦註冊開放,數百名申請人將在一次註冊。他們被允許選擇5個不同的工作。稍後在註冊會話結束時,管理員將逐個完成每項工作。我用一張表(jobapplied)來存儲2個項目(申請人ID,工作ID)來記錄誰應用了什麼。這是導致上述說法的表格。我意識到這張表沒有PRIMARY鍵,但我以後無法找出任何其他方式讓管理員專門搜索已申請的工作。

有關如何優化表格的任何建議?

+0

爲什麼應用程序沒有PRIMARY KEY? – 2010-10-29 07:24:31

+0

您能向我們展示EXPLAIN語句的結果嗎?此外,請儘量避免使用字符串「2」,「85」的整數值所期望的類型轉換。 – Vadim 2010-10-29 07:34:32

+0

下面是解釋 - http://img180.imageshack.us/img180/5930/explain.jpg – exentric 2010-10-29 08:34:04

回答

0

你被jobapp.timestamp訂購,但沒有索引時間戳所以tablesort(也可能是暫時的),有必要嘗試添加和指數時間戳jobapp像KEY膽小(時間戳,ID)

+0

這是正確的嗎? 「ALTER TABLE'jobapp' ADD INDEX('timestamp')」。雖然沒有變化。 – exentric 2010-10-29 08:37:30

+0

你可以嘗試ALTER TABLE jobapp ADD INDEX ja1(status,timestamp)和ALTER TABLE jobapplied ADD INDEX jad1(jid,jobstatus) – Jaydee 2010-10-29 09:44:01

1

除了其他人提到的缺失索引和主鍵之外。 。 。

一旦 表填充了數千個 數據,這可能會妨礙性能。

您似乎認爲查詢優化器將在具有數千行的表上使用相同的執行計劃,因爲它將在僅有幾行的表上使用。優化器不能像那樣工作。

唯一可靠的方式來告訴特定供應商的優化將如何對錶執行查詢與數千行 - 這仍然是一個小桌子,並可能輕鬆放置於內存 - 是

  • 負載 數據庫與數千行的一個臨時版本
  • ,「解釋」查詢你感興趣的

FWIW,最後的測試我跑這樣的涉及接近十億行 - 大約20張桌子中的每一張大約有5000萬美元。該查詢的執行計劃(包括大約20個左外連接)與示例數據(僅數千行)相比有很大不同。