日期:2014-05-16  浏览次数:20992 次

请教一个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 Table

CREATE 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;