2013-06-04 32 views
0
集團

我有這樣的查詢...排序MySQL查詢優化和

SELECT SQL_CACHE area3, area, area2, COUNT(area) AS total 
FROM wpthillsdatabase 
GROUP BY area 
ORDER BY area3 ASC , area ASC 

其EXPLAIN說,這是使用文件排序,沒有索引和臨時表的...

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE wpthillsdatabaseV12 ALL NULL NULL NULL NULL 9334 Using temporary; Using filesort 

是否有可能進一步優化此刪除文件或臨時表與索引或這是好的,因爲它得到?

僅供參考表是通過將區域2列到最後的結構是這樣的...

CREATE TABLE `wpthillsdatabase` (
    `hillnumber` varchar(6) NOT NULL default '', 
    `wikipedia` varchar(100) NOT NULL default '', 
    `hillname` varchar(100) NOT NULL default '', 
    `meters` char(6) NOT NULL default '', 
    `GridZN` char(2) NOT NULL default '', 
    `GridEast` char(5) NOT NULL default '', 
    `GridNorth` char(5) NOT NULL default '', 
    `numeast` char(7) NOT NULL default '', 
    `numnorth` char(7) NOT NULL default '', 
    `areadecimal` decimal(5,2) NOT NULL default '0.00', 
    `area` varchar(3) NOT NULL default '', 
    `area2` varchar(100) NOT NULL default '', 
    `maps` varchar(100) NOT NULL default '', 
    `waypointname` char(6) character set latin1 collate latin1_bin NOT NULL default '', 
    `latitude` decimal(10,8) NOT NULL default '0.00000000', 
    `longitude` decimal(10,7) NOT NULL default '0.0000000', 
    `area3` smallint(2) NOT NULL default '0', 
    `dip` decimal(5,1) NOT NULL default '0.0' COMMENT 'col height (m)', 
    `climbedbytotal` smallint(6) NOT NULL default '0', 
    `trigID` varchar(6) NOT NULL default '', 
    `trigEast` varchar(7) NOT NULL default '', 
    `trigNorth` varchar(7) NOT NULL default '', 
    `trigLat` varchar(10) NOT NULL default '', 
    `trigLon` varchar(10) NOT NULL default '', 
    `SummitInfo` varchar(290) NOT NULL default '', 
    PRIMARY KEY (`hillnumber`,`area3`), 
    UNIQUE KEY `meters` (`meters`,`hillnumber`), 
    UNIQUE KEY `SortIndex1` (`hillnumber`,`hillname`,`meters`), 
    UNIQUE KEY `NearByHills` (`numeast`,`numnorth`,`hillnumber`), 
    UNIQUE KEY `hillnumber_only` (`hillnumber`), 
    UNIQUE KEY `Area3_Sort` (`area3`,`hillnumber`,`hillname`,`meters`), 
    UNIQUE KEY `GirdZN_sort` (`GridZN`,`hillnumber`,`hillname`,`meters`), 
    UNIQUE KEY `hil_lat_lon` (`hillnumber`,`latitude`,`longitude`), 
    KEY `trigID` (`trigID`,`hillname`,`meters`), 
    KEY `climbedbytotal` (`climbedbytotal`), 
    KEY `hillname` (`hillname`,`meters`), 
    KEY `area3` (`area3`,`hillnumber`), 
    KEY `hillname_only` (`hillname`), 
    KEY `area3_trigID` (`area3`,`trigID`), 
    KEY `Area_text` (`area`,`area3`), 
    KEY `dip_area3` (`dip`,`area3`), 
    KEY `lat_lon` (`latitude`,`longitude`,`meters`), 
    KEY `trigID_area3` (`trigID`,`area3`), 
    KEY `numeast_north` (`numeast`,`numnorth`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ; 

Ta 

菲爾

回答

2

什麼你的要求意味着:

  • GROUP BY area可以使用開始area
  • ORDER BY are3 ASC, area ASC被索引優化可以使用開始area3, area

被索引優化,但可以使用索引以同時優化兩個位。

如果您可以負擔得起更改結果,請嘗試更改排序順序:ORDER BY area ASC, area3 ASC

由於bobwienholt建議,您可以在表測試覆蓋指數至少優化GROUP表的提取,但指數應與area開始:KEY myKey (area, area3, area2)。但是,如果您的表變得很大並且頻繁更新,那麼如果您的表經常更新,那麼乘以索引(特別是當它們包含varchar(100)列時)可能會妨礙性能。根據具體情況,你最好從MySQL提取未分類的數據,並在你的服務器代碼中過濾/排序它們(php/ruby​​/python ...)

+0

嗨,有用的,我沒有意識到這一點。如果我的表有一列經常更新但沒有出現在這個查詢中,也沒有出現在任何索引中的列(「climbedbytotal」),這是否會導致執行問題? –

+1

您應該刪除任何您不會搜索該值的單列索引。這是浪費空間,確實會使更新和插入速度變慢。不要被像「索引減慢更新」這樣的語句嚇倒......除非你像更瘋狂地更新你的表,否則SELECT的性能優勢將遠遠超過任何更新性能的損失。 – bobwienholt

+0

謝謝你很有用 –

1

你可以把「Area_text」變成了覆蓋索引。不知道它是否有助於優化GROUP BY或ORDER BY,但它將允許MySQL僅使用該索引來處理查詢,這應該加快查詢速度。

+0

是的,肯定有幫助 - 謝謝 –