2016-02-05 102 views
0

我看了論壇上很多帖子,但我仍然對創建索引,以加快在MySQL連接查詢的混亂,這裏是我的疑問混亂創建索引來提高連接性能在MySQL

我有兩個表,一個是category表,其中只包含幾千行,幷包含所有有關數據的信息,另一個是geo_data包含大量數據的表,我加入geo_data表基於2個鍵s_key1s_key2。以下是表

的結構

類別

CREATE TABLE `category` (
    `Id` int(11) NOT NULL AUTO_INCREMENT, 
    `s_key1` int(11) DEFAULT NULL, 
    `s_key2` int(11) DEFAULT NULL, 
    `STD_DATE` datetime DEFAULT NULL, 
    `LATITUDE` float DEFAULT NULL, 
    `LONGITUDE` float DEFAULT NULL, 
    `COUNTRY_CD` varchar(15) DEFAULT NULL, 
    `INSTR_CODE` varchar(15) DEFAULT NULL, 
    `CANADACR_CD` varchar(15) DEFAULT NULL, 
    `PROBST_T` varchar(15) DEFAULT NULL, 
    `TYPE` varchar(15) DEFAULT NULL, 
    PRIMARY KEY (`Id`) 
) ENGINE=MyISAM AUTO_INCREMENT=32350 DEFAULT CHARSET=latin1; 

geo_data

CREATE TABLE `geo_data` (
    `s_key1` int(11) DEFAULT NULL, 
    `s_key2` int(11) DEFAULT NULL, 
    `MAGNETIC` float DEFAULT NULL, 
    `GRAVITY` float DEFAULT NULL, 
    `BATHY` float DEFAULT NULL, 
    `CORE` float DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

我有很多表等,其含有s_key1s_key2等欄目,在我的應用geo_data表我經常使用字段std_date,緯度,經度,country_cd,從category

我做內部聯接,有時留根據需求加入,例如我的查詢看起來像下面

SELECT 
     c.s_key1, 
     c.s_key2, 
     c.std_date, 
     c.latitude, 
     c.longitude, 
     g.magnetic, 
     g.bathy 
FROM 
     category c, geo_data g 
WHERE 
     c.s_key1 = g.s_key1 && c.s_key2 = g.s_key2; 

,有時我where子句將有這樣的事情太

WHERE 
      c.latitude between -30 to 30 AND 
      c.longitude between 10 to 140 AND 
      c.country_cd = 'INDIA' AND 
      c.type = 'NON_PROFIT'; 

那麼,創建索引以加快我的查詢的正確方法是什麼?請別人幫

create index `myindex` on 
`category` (s_key1,s_key2,std_date,latitude,longitude,country_cd) 

create index `myindex` on 
`geo_data` (s_key1,s_key2) 

還有一個疑問,這兩個表(類別,geo_data)是否應該有索引鍵來提高性能或者只geo_data表?

+0

與聯接查詢我倒是去創建索引'myindex'在 'geo_data'(s_key1,s_key2)由於這一事實,你必須在聲明 –

+0

@YehiaAwad的&&:有時我需要從類別表對比緯度,經度爲好,所以如果我只用s_key1創建索引,s_skey2上類別表會提高性能嗎? – user3637224

回答

1

從where條件是有意義的簡化第一指數爲:

create index `myindex` on 
`category` (s_key1,s_key2) 

原來但是可以改善方面的性能,它不必訪問完整的錶行,以獲得其他值。但它會使指數變大,因此變慢。因此,這取決於這是僅針對此查詢進行優化還是隻有使用s_key1和s_key2(或與其他列組合)的更多。

關於澄清 - 爲緯度/經度檢查它纔有意義移動緯度/經度後std_date(或完全刪除):

create index `myindex` on 
`category` (s_key1,s_key2,latitude,longitude,std_date,country_cd) 
+0

有時我需要比較緯度和經度以及類別表,所以如果我只使用s_key1創建索引,類別表上的s_skey2會提高性能嗎? – user3637224

+0

到目前爲止geo_data表只有s_key1和s_key2夠了嗎? – user3637224

+0

@ user3637224:是的。 –