2016-02-05 61 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:是的。 –