【问题标题】:Confusion on creating index to improve join performance in mysql混淆创建索引以提高mysql中的连接性能
【发布时间】:2016-02-05 12:04:15
【问题描述】:

我在论坛上阅读了很多帖子,但我仍然对创建索引以加快 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;

我有很多表,例如 geo_data 表,其中包含 s_key1s_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


【解决方案1】:

根据 where 条件,将第一个索引简化为:

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

然而,原始版本可以提高性能,因为它不必访问整个表行来获取其他值。然而,它使索引更大,因此更慢。因此,这取决于这是仅针对此查询的优化,还是更多仅使用 s_key1 和 s_key2(或与其他列组合)的优化。

关于澄清 - 对于 lat/lng 检查,将 std_date 移到 lat/lng 之后(或完全删除)是有意义的:

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

【讨论】:

  • 有时我需要比较类别表中的纬度、经度,所以如果我在类别表上仅使用 s_key1,s_skey2 创建索引会提高性能吗?
  • 目前geo_data表只有s_key1,s_key2够了吧?
猜你喜欢
  • 1970-01-01
  • 2022-06-17
  • 2014-06-10
  • 2021-04-29
  • 2020-06-22
  • 2011-09-17
  • 2018-12-23
  • 2021-09-19
  • 2013-02-04
相关资源
最近更新 更多