下面介绍的是我在工作中遇到的SQL语句查询实例。

初始编写的SQL语句如下:
USE tj3_stat;
SELECT gy_login.user_id,gy_login.username,min(gy_login.record_date) AS FIRST_day_login,max(gy_login.record_date) AS LAST_day_login,max(gy_roleinfo.level0) AS roleinfo_level
FROM gy_login
INNER JOIN gy_roleinfo ON gy_login.user_id=gy_roleinfo.user_id
WHERE gy_login.user_id IN
(
 SELECT user_id FROM gy_login
 WHERE gy_login.record_date < '2012-09-01'
 GROUP BY user_id;
)
GROUP BY gy_login.user_id;
该SQL语句执行效率非常低,执行等待时间太长了,以至于没有等到结果出来我就停止执行了。
将上面WHERE IN语句中的
SELECT user_id FROM gy_login
 WHERE gy_login.record_date < '2012-09-01'
 GROUP BY user_id;
结果放到临时表中,然后再将WHERE IN子句替换为INNER JOIN,这样就效率就提升了,临时表创建如下:
a、未添加索引:
CREATE TEMPORARY TABLE test.t1 (
`user_id` int(10) unsigned NOT NULL
 );
以下通过ALTER语句添加索引:
ALTER TABLE `test`.`t1` ADD PRIMARY KEY ( `user_id` );
b、在创建临时表的同时添加索引:
CREATE TEMPORARY TABLE test.t1 (
`user_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`user_id`) 
);
再将WHERE IN子句中的结果插入到临时表中:
INSERT INTO test.t1
 SELECT user_id FROM tj3_stat.gy_login
 WHERE gy_login.record_date < '2012-09-01'
 GROUP BY user_id;

经过优化调整后完整语句如下:
SET names latin1;
DROP TABLE IF EXISTS test.t1;

CREATE TEMPORARY TABLE test.t1 (
`user_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`user_id`) 
);

INSERT INTO test.t1
 SELECT user_id FROM tj3_stat.gy_login
 WHERE gy_login.record_date < '2012-09-01'
 GROUP BY user_id;

USE tj3_stat;
SELECT gy_login.user_id,gy_login.username,min(gy_login.record_date) AS FIRST_day_login,max(gy_login.record_date) AS LAST_day_login,max(gy_roleinfo.level0) AS roleinfo_level
FROM gy_login
INNER JOIN gy_roleinfo ON gy_login.user_id=gy_roleinfo.user_id
INNER JOIN test.t1 AS a ON gy_login.user_id=a.user_id
GROUP BY gy_login.user_id;

总结:在对这个SQL进行优化调整中用到了临时表,索引、表联查等,关于这些我也是略知一二,如有对上述概念及应用不理解的同学,请查阅相关资料。
参考链接:
1、临时表:http://dev.mysql.com/doc/refman/5.1/zh/optimization.html
2、索引添加:http://space.itpub.net/21825410/viewspace-610425
3、表联查:http://www.w3school.com.cn/sql/sql_join_inner.asp
如有疑问:请及时与我联系。