簡體   English   中英

在創建索引以提高mysql中的聯接性能方面的困惑

[英]Confusion on creating index to improve join performance in mysql

我在論壇上讀了很多帖子,但是仍然對創建索引以加快mysql中的聯接查詢感到困惑,這是我的疑問

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

類別

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,緯度,經度,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)

還有一個疑問,兩個表(category,geo_data)是否應該都具有索引鍵以提高性能,還是只有geo_data表?

從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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM