MySQL巧建sum索引幫我們提高至少100%的效率


有兩個表,表a

CREATE TABLE `a` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`fid` smallint(6) unsigned NOT NULL DEFAULT '0',
`cnt` smallint(6) unsigned NOT NULL DEFAULT '0',
...
...
...
PRIMARY KEY (`id`),
KEY `idx_fid` (`fid`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8

表b

CREATE TABLE `b` 
(`fid` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`name` char(50) NOT NULL DEFAULT '',
...
...
...
PRIMARY KEY (`fid`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8

操作SQL如下:

SELECT COUNT(*) AS num1, SUM(a.cnt)+COUNT(*) AS num2
FROM a, b
WHERE b.fid='10913' AND a.fid=b.fid

我們先看下執行計划:

我們可以看到掃描行數是229049行,執行時間:

太可怕了,運行set profiling=1,讓我們看看時間主要消耗在哪里?

show profiles;

取id,用於下面的查詢中 query后的參數

show profile cpu, block io for query 1

sending data花費的時間較長,那這段時間到底是做什么的呢?先看下這個吧:http://renxijun.blog.sohu.com/82906360.html

意思是它在為select語句准備數據,解決辦法:

建索引:

create index idx_fid_cnt on a (fid,cnt);

 

再看下,執行計划和執行時間:

總結:使用恰當的索引,是sql的效率倍增,類似sum的函數還有min(),max(),這些都需要在字段上建索引

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM