MySQL社区

标题: SQL查询速度与表的先后顺序问题 [打印本页]

作者: admin    时间: 2007-7-20 18:15
标题: SQL查询速度与表的先后顺序问题
作者:kider

在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表(放在where的最后),最先处理。如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表。

例1:
表 TAB1 16,384 条记录
表 TAB2 1 条记录

选择TAB2作为基础表 (最好的方法)
select count(*) from tab1,tab2 执行时间0.96秒
选择TAB1作为基础表 (不佳的方法)
select count(*) from tab2,tab1 执行时间26.09秒
作者: edwin_chen    时间: 2007-10-30 16:10
我测试了一下,感觉好像你的说法有点问题。
---------------------------------------------------------------------------
mysql> select count(*) from ACTION;
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set (0.96 sec)

mysql> select count(*) from CONFIGTEMPLATE;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)
-------------------------------------------------------------------------
mysql> select count(*) from ACTION, CONFIGTEMPLATE;
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set (8.23 sec)

mysql> select count(*) from CONFIGTEMPLATE, ACTION;
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set (8.26 sec)
---------------------------------------------------------------------------------
根据上面的测试结果,似乎没有太明显的差别。
另外我的测试表都是innodb,不知道是不是这个原因,所有才没有差别。
作者: kider    时间: 2007-10-30 21:41
首先很欣赏你的这种探索和试验精神,学习之!

“SQL查询速度与表的先后顺序问题”一文是针对Oracle数据库的。因为由Oracle的SQL优化机制所决定(成本、代价),以上结论是正确的。

查询了资料,而MySQL是代价优化机制,意味着不管表在前还是在后,MySQL都会以SQL花费的代价为优化前提,综合得出一个代价最低的SQL去执行,所以表在前或后都被优化成一样的代价SQL,前后顺序就没有多大意义了。故你的试验是正确的。

感谢你的试验。
作者: edwin_chen    时间: 2007-10-31 12:02
谢谢,又涨见识了!
作者: sflong    时间: 2008-9-1 17:18
真是牛人啊,对你这种试验精神很敬佩.不过你那个1000000条数据的表怎么弄的,能比较快的插入这么多测试数据?是直接在sql中做的,还是通过程序循环完成的?
作者: sflong    时间: 2008-9-1 17:19
感觉人气不是很旺啊
作者: kider    时间: 2008-9-1 19:17
是呀,没有足够的宣传呢,好东西还没有被充分的发现呀




欢迎光临 MySQL社区 (http://www.mysqlpub.com/) Powered by Discuz! X3.2