我有這樣的查詢...排序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
菲爾
嗨,有用的,我沒有意識到這一點。如果我的表有一列經常更新但沒有出現在這個查詢中,也沒有出現在任何索引中的列(「climbedbytotal」),這是否會導致執行問題? –
您應該刪除任何您不會搜索該值的單列索引。這是浪費空間,確實會使更新和插入速度變慢。不要被像「索引減慢更新」這樣的語句嚇倒......除非你像更瘋狂地更新你的表,否則SELECT的性能優勢將遠遠超過任何更新性能的損失。 – bobwienholt
謝謝你很有用 –