2011-08-03 89 views
0

你好夥計,MYSQL價值差異優化

我運行一個非常大的數據庫(ATM像> 5百萬數據集)。我的數據庫存儲自定義生成的數字(它們以及它們的構成方式在這裏並不重要)以及與此相對應的日期。此外,每個產品都存儲一個ID(意味着一個產品可以在我的數據庫中有不同日期的多個條目 - >主鍵被分割)。現在我想要SELECT那些前兩天得分最大的前10名身份證號碼。目前我嘗試使用JOINS來實現這一點,但是由於我以這種方式獲得了這麼多的數據集,速度很慢。我怎麼能加快整個操作?

SELECT 
    d1.place,d2.place,d1.ID 
FROM 
    daily 
INNER JOIN 
    daily AS d1 ON d1.date = CURDATE() 
INNER JOIN 
    daily as d2 ON d2.date = DATE_ADD(CURDATE(), INTERVAL -1 DAY) 
ORDER BY 
    d2.code-d1.code LIMIT 10 

編輯:這就是我的結構看起來像

CREATE TABLE IF NOT EXISTS `daily` (
`ID` bigint(40) NOT NULL, 
`source` char(20) NOT NULL, 
`date` date NOT NULL, 
`code` int(11) NOT NULL, 
`cc` char(2) NOT NULL, 
PRIMARY KEY (`ID`,`source`,`date`,`cc`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

多數民衆贊成在Explain聲明

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE d1 ALL PRIMARY NULL NULL NULL 5150350 Using where; Using temporary; Using filesort 
1 SIMPLE d2 ref PRIMARY PRIMARY 8 mytable.d1.ID 52 Using where 
+0

見編輯答案 – Mchl

回答

1

這個怎麼樣的輸出?

SELECT 
    d1.ID, d1.place, d2.place 
FROM 
    daily AS d1 
CROSS JOIN 
    daily AS d2 
USING (ID) 
WHERE 
    d1.date = CURDATE() 
    AND d2.date = CURDATE() - INTERVAL 1 DAY 
ORDER BY 
    d2.code - d1.code DESC 
LIMIT 
    10 

你的表結構的幾點思考。

`ID` bigint(40) NOT NULL, 

爲什麼選擇BIGINT?您需要每週7天,每天24小時進行136次插入,每年耗盡INT的範圍。在你到達一半之前,你的應用程序可能需要一個專業的DBA。 記住,較小的主索引導致fater查找 - 這給我們帶來:

PRIMARY KEY (`ID`,`source`,`date`,`cc`) 

爲什麼? ID列上的單列PK應該足夠了。如果您需要其他列上的索引,請創建其他索引(並明智地)。事實上,你基本上有一個整個表的覆蓋索引...就像索引中有整個表一樣。

最後但並非最不重要:哪裏是place列?你已經在你的查詢中使用它(然後我在我的),但它無處可見?

建議表結構:

CREATE TABLE IF NOT EXISTS `daily` (
`ID` int(10) UNSIGNED NOT NULL, --usually AUTO_INCREMENT is used as well, 
`source` char(20) NOT NULL, 
`date` date NOT NULL, 
`code` int(11) NOT NULL, 
`cc` char(2) NOT NULL, 
PRIMARY KEY (`ID`), 
KEY `ID_date` (`ID`,`date`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
+0

沒有其他的甚至是快速的方式? –

+0

不知道你的表結構?沒門。事實上,我甚至不知道這是否你想要做什麼,P – Mchl

+0

這就是我的結構是什麼樣子:)'每天 費爾德\t典型\t空\t標準\t Kommentare ID \t BIGINT(40)\t Nein \t \t 源\t炭(20)\t \t Nein \t 日期\t \t日期Nein \t \t 代碼\t INT(11)\t \t Nein \t cc \t char(2)\t Nein \t \t' –