免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2042 | 回复: 5
打印 上一主题 下一主题

看看我这条SQL有问题没有! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-27 11:32 |只看该作者 |倒序浏览
mysql> select count(distinct f.id) from friend AS f, queue AS q where q.date_c > '2008-7-01 00:00:00' AND q.date_c < '2009-10-01 00:00:00' AND f.friend = q.to_id;

执行了1个小时,还没有出来结果!

下面是表的相关信息:
mysql> desc friend;
+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| id             | int(10) unsigned | NO   | PRI |         |       |
| friend       | int(10) unsigned | NO   | PRI |         |       |
| catalog    | char(50)              | NO   |     |         |       |
| nickname | char(50)              | NO   |     |         |       |
+----------+------------------+------+-----+---------+-------+
4 rows in set (0.07 sec)

mysql> desc queue;
+---------+------------------+------+-----+---------+-------+
| Field   | Type             | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+-------+
| to_id    | int(10) unsigned  | NO   | PRI |         |       |
| from_id | int(10) unsigned | NO   | PRI |         |       |
| date_c  | datetime             | NO   | MUL |         |       |
+---------+------------------+------+-----+---------+-------+
3 rows in set (3.42 sec)

mysql> select count(*) from friend;
+----------+
| count(*) |
+----------+
| 38224881 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from queue;
+----------+
| count(*) |
+----------+
|  2047319 |
+----------+
1 row in set (0.00 sec)

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
2 [报告]
发表于 2009-02-27 11:43 |只看该作者
语句没有问题。
explain语句 看下走了那些索引没。

各统计一下符合你时间条件的各表有多少数据?

如果量远比这小,可以将两表结果建立临时表,再关联。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
3 [报告]
发表于 2009-02-27 13:44 |只看该作者
一般在写语句的时候先建关联 f.friend = q.to_id

select count(distinct f.id)
&nbsp;&nbsp;from friend AS f, queue AS q
&nbsp;where f.friend = q.to_id
&nbsp;&nbsp;&nbsp;and q.date_c > '2008-7-01 00:00:00'
&nbsp;&nbsp;&nbsp;and q.date_c < '2009-10-01 00:00:00'

论坛徽章:
0
4 [报告]
发表于 2009-02-27 14:02 |只看该作者
原帖由 大大狗 于 2009-2-27 13:44 发表
一般在写语句的时候先建关联 f.friend = q.to_id

select count(distinct f.id)
&nbsp;&nbsp;from friend AS f, queue AS q
&nbsp;where f.friend = q.to_id
&nbsp;&nbsp;&nbsp;and q.date_c > '2008-7- ...

为什么这么说呢?
不都是取到字段去另外一个关联表检索吗,比如这个表有N个数据,另外一个是M 不是N*M 吗?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2009-02-27 16:43 |只看该作者
原帖由 webyuhang 于 2009-2-27 14:02 发表

为什么这么说呢?
不都是取到字段去另外一个关联表检索吗,比如这个表有N个数据,另外一个是M 不是N*M 吗?



我的意思是说条件的先后顺序


在ORACLE 中条件的先后顺序是会影响到查询速度的

mysql 应该也差不多吧

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
6 [报告]
发表于 2009-02-27 16:59 |只看该作者
  1. mysql> explain select count(*) from showdata a ,t_prehandle_qeesoo_visit_02 as b where a.guid=b.guid and a.addtime > '2009-02-25' \G;
  2. *************************** 1. row ***************************
  3.            id: 1
  4.   select_type: SIMPLE
  5.         table: b
  6.          type: index
  7. possible_keys: NULL
  8.           key: PRIMARY
  9.       key_len: 8
  10.           ref: NULL
  11.          rows: 157796
  12.         Extra:
  13. *************************** 2. row ***************************
  14.            id: 1
  15.   select_type: SIMPLE
  16.         table: a
  17.          type: ref
  18. possible_keys: addtime,guid
  19.           key: guid
  20.       key_len: 453
  21.           ref: qeesoo_bi.b.guid
  22.          rows: 35
  23.         Extra: Using where
  24. 2 rows in set (0.01 sec)

  25. ERROR:
  26. No query specified

  27. mysql> explain select count(*) from showdata a ,t_prehandle_qeesoo_visit_02 as b where  a.addtime > '2009-02-25' and  a.guid=b.guid \G;
  28. *************************** 1. row ***************************
  29.            id: 1
  30.   select_type: SIMPLE
  31.         table: b
  32.          type: index
  33. possible_keys: NULL
  34.           key: PRIMARY
  35.       key_len: 8
  36.           ref: NULL
  37.          rows: 157796
  38.         Extra:
  39. *************************** 2. row ***************************
  40.            id: 1
  41.   select_type: SIMPLE
  42.         table: a
  43.          type: ref
  44. possible_keys: addtime,guid
  45.           key: guid
  46.       key_len: 453
  47.           ref: qeesoo_bi.b.guid
  48.          rows: 35
  49.         Extra: Using where
  50. 2 rows in set (0.00 sec)

  51. ERROR:
  52. No query specified

  53. mysql>
复制代码
mysql从走的索引来看一样的,oracle是的。

[ 本帖最后由 枫影谁用了 于 2009-2-27 17:00 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP