
MYSQL数据库,如何用一条实现效率高的多结果查询。 就是要一条综合语句执行的时间比分开执行效率高。
已知的两种方法都不过关,例如:1.SELECT*FROM`vendor`whereproduct=1unionSELECT*FROM`vendor`whereproduc...
已知的两种方法都不过关,例如:
1. SELECT * FROM `vendor` where product=1 union SELECT * FROM `vendor` where product=2
2. SELECT * FROM `vendor` where product in (1,2)
上述语句的执行时间和分别执行两个product分别查询的时间总和一样,请问高手,有没有什么办法能够少于分别查询的时间。
如果mysql实现不了,其他的什么数据库能最高效得做到这一点?
数据库大概有200万条数据,而所需要的一次能查1000条不同属性的语句。用union连接1000条语句,大概运行119秒左右,如果用in,时间也差不多。比1000条语句一个一个连发的总时间还慢一点。电脑算中等配置。现在需要的就是能够大幅度提高效率的方法,最少也不能慢过1000条语句分散发。如果mysql实现不了,其他方法也可以考虑。用netbean的java语言连接数据库。
上述例子的vendor表建立为,
id product
1 3
2 2
3 1 展开
1. SELECT * FROM `vendor` where product=1 union SELECT * FROM `vendor` where product=2
2. SELECT * FROM `vendor` where product in (1,2)
上述语句的执行时间和分别执行两个product分别查询的时间总和一样,请问高手,有没有什么办法能够少于分别查询的时间。
如果mysql实现不了,其他的什么数据库能最高效得做到这一点?
数据库大概有200万条数据,而所需要的一次能查1000条不同属性的语句。用union连接1000条语句,大概运行119秒左右,如果用in,时间也差不多。比1000条语句一个一个连发的总时间还慢一点。电脑算中等配置。现在需要的就是能够大幅度提高效率的方法,最少也不能慢过1000条语句分散发。如果mysql实现不了,其他方法也可以考虑。用netbean的java语言连接数据库。
上述例子的vendor表建立为,
id product
1 3
2 2
3 1 展开
展开全部
zwb12340 说的就是错的
首先来说一下你的这两种写法
1.这一个比较快,其实这是把两个SQL 拼接成1个SQL,但是在拼接的时候使用了UNION ,这个过程会排序去重复,这一点上会影响性能。可以把UNION 改成UNION ALL,UNION ALL不会排序去重,可能效率会更好一点
2.这一个不会太快,因为使用in的话,默认是不使用索引的,那么这一个过程会全表扫描,那么就很慢了(我这里说的索引是默认的B+树索引,是自动屏蔽的,如果是BITMAP索引的话,是会使用的),
对于你这个问题的解决,我给以下几个意见
1.首先把UNION改成UNION ALL试一试,看效率怎么样
2.检查是否在product上有没有索引,尽量建一个索引
3.如果以上两个改进之后,还没效果的话,可以在这个表上,基于product建立分区表,使用分区表的话,那么效果会比较明显
首先来说一下你的这两种写法
1.这一个比较快,其实这是把两个SQL 拼接成1个SQL,但是在拼接的时候使用了UNION ,这个过程会排序去重复,这一点上会影响性能。可以把UNION 改成UNION ALL,UNION ALL不会排序去重,可能效率会更好一点
2.这一个不会太快,因为使用in的话,默认是不使用索引的,那么这一个过程会全表扫描,那么就很慢了(我这里说的索引是默认的B+树索引,是自动屏蔽的,如果是BITMAP索引的话,是会使用的),
对于你这个问题的解决,我给以下几个意见
1.首先把UNION改成UNION ALL试一试,看效率怎么样
2.检查是否在product上有没有索引,尽量建一个索引
3.如果以上两个改进之后,还没效果的话,可以在这个表上,基于product建立分区表,使用分区表的话,那么效果会比较明显
追问
union all 确实比 union 要快一些, 但是时间上只是减少了零头,还没有达到本质上的改变。
追答
朋友,楼下的这个 退伍的工科平民 所说的绝对是错误的。我不误导你。
1. 他说的第二种方法比第一种要快,还说 product=1 or product=2 这种是绝对使用索引的,这简直是太可笑了。数据库除非使用的索引是BITMAP索引,不然使用OR和IN都是非常消耗性能的,在数据库SQL调优中,从来都是要对这种语句进行调优的。这一点你可以百度查一下的,OR和IN在使用过程中,会使用INDEX,但是会concat方式来做,效率非常慢,而且值得一说的是:在数据库里面,IN和OR是等效的,如果你会查执行计划的话,就会发现,使用OR和使用IN的执行计划是完全一致的
2. 你下面说的这个排序是通过ID来的,这个是肯定的,在设计中,不可能用名称来做排序。
3.你说UNION ALL比UNION快一点,但只是快了一点零头,那是因为这里快的仅仅是在数据选择出来之后,是否有再加工的这个过程,UNION ALL去除了再加工的过程,所以快一点,但不是很快,因为你本身在查询中的消耗是最大的。
还是那个意见,对product建索引,如果实在不行就建成分区表(partition table)
展开全部
楼上说反了吧?第一种效率高点。
1. SELECT * FROM `vendor` where product=1 union SELECT * FROM `vendor` where product=2
2. SELECT * FROM `vendor` where product in (1,2)
上述语句的执行时间和分别执行两个product分别查询的时间总和一样。
不对,这两个执行查询时间不一样。当然,索引情况下,差别不大。非索引情况下,union的时间会比in的方式时间少。 一般不采用in。
执行查询的时间,不仅跟数据量有关,也跟数据结构有关。一般推荐使用union。in是需要一个一个对比的判断,union不需要这个判断,union直接把结果集放在一起。所以快一点。
1. SELECT * FROM `vendor` where product=1 union SELECT * FROM `vendor` where product=2
2. SELECT * FROM `vendor` where product in (1,2)
上述语句的执行时间和分别执行两个product分别查询的时间总和一样。
不对,这两个执行查询时间不一样。当然,索引情况下,差别不大。非索引情况下,union的时间会比in的方式时间少。 一般不采用in。
执行查询的时间,不仅跟数据量有关,也跟数据结构有关。一般推荐使用union。in是需要一个一个对比的判断,union不需要这个判断,union直接把结果集放在一起。所以快一点。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.第一个写法太烂了,在一个表中不需要这样;
2,第二个写法效率已经很高了;
3;将product建立索引,将提高查询效率很多
4.不是查询数据需要尽量不要select *
5.检测查询效率,数据库要有足够的记录数,少了没有效果,怎么写,查询时间几乎都是一样
2,第二个写法效率已经很高了;
3;将product建立索引,将提高查询效率很多
4.不是查询数据需要尽量不要select *
5.检测查询效率,数据库要有足够的记录数,少了没有效果,怎么写,查询时间几乎都是一样
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建索引!没有索引,任何数据库都会做全表扫描,就是遍历200万条数据,否则数据库系统不能肯定是不是有符合要求的数据漏掉。2的20次方是100万,如果是折半查找,21次查找操作就可以找到你要的单个数据。
而写法1和写法2的效率相差就是2倍不到,所以建好索引效率查上千倍。
不要纠缠在哪种写法上!
写法2绝对比写法1要快。in是不是不用索引我不知道,不同数据库可能不一样。我就不明白为什么不用 product=1 or product=2 呢?这个肯定会用索引的,如果有索引的话。
不管 in 还是 product=1 or product=2 都是在一次全表扫描中就可以直接实现了的。
而用union、union all,即便利用到第一次全表扫描的执行结果,还是:全表扫描-》排序-》再查找,就是说如果没有索引,1次全表扫描肯定是逃不掉的。
而写法1和写法2的效率相差就是2倍不到,所以建好索引效率查上千倍。
不要纠缠在哪种写法上!
写法2绝对比写法1要快。in是不是不用索引我不知道,不同数据库可能不一样。我就不明白为什么不用 product=1 or product=2 呢?这个肯定会用索引的,如果有索引的话。
不管 in 还是 product=1 or product=2 都是在一次全表扫描中就可以直接实现了的。
而用union、union all,即便利用到第一次全表扫描的执行结果,还是:全表扫描-》排序-》再查找,就是说如果没有索引,1次全表扫描肯定是逃不掉的。
追问
您好,我才学了数据库没多久。请问一下,之前的货物有很多维的属性,每种属性间有优先值。我最后把这些属性转化成了全排序,并用数字来代表每一种具体货物,这些数字只表示名称。我的意思说,查找的时候不可能根据货物名称来决定排序,只能根据他们的id有一个卖方的偏好续。具体实验的时候200万条数据是随机生成的数字。
追答
"有很多维的属性,每种属性间有优先值……把这些属性转化成了全排序……"? 你做的不是数据仓库吧?不好意思,看不太懂你的意思,能举个例子么?
如果你的意思是复合主键,比如三个属性确定一个产品: product_attr1、 product_attr2、product_attr3 ,那么也一样呀:
SELECT * FROM `vendor` where
( product_attr1=11 and product_attr2=12 and product_attr3=13 ) or
( product_attr1=21 and product_attr2=22 and product_attr3=23 )
同样的,记得先对 product_attr1、 product_attr2、product_attr3 建复合索引。
CREATE INDEX ind_vendor_product
ON vendor (product_attr1, product_attr2 , product_attr3);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-05-05
展开全部
我认为你应该为其列创建一个索引(如果该列的值是唯一的那么创建聚集索引否则非聚集索引(unclustered))这样速度更高些同事也不能用*号 最好采取所需要查询的信息列名
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询