首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Mysql >

请问一个sql有关问题,要查一分钟啊压力太大了,求大神指点

2012-10-20 
请教一个sql问题,要查一分钟啊,压力太大了,求大神指点!三张表:tb_statistic_stat,tb_statistic_exit,tb_de

请教一个sql问题,要查一分钟啊,压力太大了,求大神指点!
三张表:tb_statistic_stat,tb_statistic_exit,tb_developers_service

SHOW INDEX 分别为
Non_unique:0、0、0
Key_name:PRIMARY、PRIMARY、PRIMARY
Seq_in_index:1、1、1
Column_name:uid、id、id
Collation:A、A、A
Cardinality:115755、489436、46
Index_type:BTREE、BTREE、BTREE


目前的sql语句是这样

SQL code
SELECT * FROM tb_statistic_stat  s,(SELECT COUNT(id) visitCount,uid FROM tb_statistic_exit WHERE 1=1  GROUP BY uid) v,tb_developers_service d WHERE s.uid=v.uid AND s.cpid = d.developersId AND s.appid = d.productsId  limit 0,10


查询需要一分多钟 求大神指点。。。。


表结构分别如下:
SQL code
Create TableCREATE TABLE `tb_statistic_stat` (  `uid` varchar(36) NOT NULL,  `appid` varchar(255) DEFAULT NULL,  `chid` varchar(10) DEFAULT NULL,  `cpid` varchar(10) DEFAULT NULL,  `cydia` varchar(255) DEFAULT NULL,  `lang` varchar(255) DEFAULT NULL,  `operator` varchar(255) DEFAULT NULL,  `ua` varchar(255) DEFAULT NULL,  `udid` varchar(255) DEFAULT NULL,  `ver` varchar(50) DEFAULT NULL,  `version` varchar(50) DEFAULT NULL,  `macAddress` varchar(255) DEFAULT NULL,  `timeString` datetime DEFAULT NULL,  PRIMARY KEY (`uid`))CREATE TABLE `tb_statistic_exit` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `uid` varchar(500) DEFAULT NULL,  `visitTime` datetime DEFAULT NULL,  `onlineTime` varchar(500) DEFAULT NULL,  PRIMARY KEY (`id`))CREATE TABLE `tb_developers_service` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `developersName` varchar(20) DEFAULT NULL,  `productsName` varchar(10) DEFAULT NULL,  `productsUrl` varchar(255) DEFAULT NULL,  `appId` int(255) DEFAULT NULL,  `developersId` varchar(10) DEFAULT NULL,  `productsId` varchar(255) DEFAULT NULL,  PRIMARY KEY (`id`))


[解决办法]
create index idx_uid_id on tb_statistic_exit(uid,id);

然后再把select的explain信息打印出来。
[解决办法]
用INNER JOIN连接查询,然后explain...比较一下了查询计划那个是最优的。

[解决办法]
把1楼提示的索引加上,然后执行
explain SELECT COUNT(id) visitCount,uid FROM tb_statistic_exit WHERE 1=1 GROUP BY uid;

把结果贴出来。
[解决办法]
不大可能是这样的结果。
show index from tb_statistic_exit;
看看结果。
[解决办法]
创建如下两个索引。

create index xxx on tb_statistic_stat(cpid,appid);
create index xxx2 on tb_statistic_exit(uid);

然后
SELECT * ,(SELECT COUNT(id) FROM tb_statistic_exit where uid=s.uid) as visitCount
FROM tb_statistic_stat s,tb_developers_service d 
WHERE s.cpid = d.developersId AND s.appid = d.productsId limit 0,10;

热点排行