【发布时间】:2016-02-05 12:04:15
【问题描述】:
我在论坛上阅读了很多帖子,但我仍然对创建索引以加快 mysql 中的连接查询感到困惑,这是我的疑问
我有两张表,一张是category 表,它只包含几千行,并且包含有关数据的所有信息,另一张是geo_data 表,其中包含大量数据,我加入geo_data 基于表在 2 个键 s_key1 和 s_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;
我有很多表,例如 geo_data 表,其中包含 s_key1、s_key2 和其他列,在我的应用程序中,我经常使用字段 std_date、latitude、longitude、country_cd、type from category table
我做内连接,有时根据要求左连接,例如我的查询如下所示
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)
还有一个疑问是两个表(category,geo_data)应该有索引键来加速性能还是只有geo_data表?
【问题讨论】:
-
使用连接查询,我会在
geo_data(s_key1,s_key2) 上创建索引myindex,因为你在 where 语句中有 && -
@YehiaAwad :有时我还需要比较类别表中的纬度、经度,所以如果我在类别表上仅使用 s_key1,s_skey2 创建索引会提高性能吗?
标签: mysql