union all 如何优化

zl87242994 2011-09-05 04:03:09
目前三个表使用union all 来获取一个数据集,单表的sql执行只需0.02s左右,union all之后大概要7s左右,数据大概在10W条左右;
该怎么提速?
...全文
1244 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiziccit 2013-12-27
  • 打赏
  • 举报
回复
??这个怎么解决?
摸着石头前行 2012-10-24
  • 打赏
  • 举报
回复
我的数据时百万级的,条件多,执行很慢,每次是取1000条数据,也很慢
ACMAIN_CHM 2011-09-06
  • 打赏
  • 举报
回复
你只要排序,则UNION ALL后的效率会很差。因为MYSQL需要自己进行排序无法利用索引。
wwwwb 2011-09-06
  • 打赏
  • 举报
回复
详细说明你的要求是什么?分页?
你的SQL语句是什么,有什么要求,看看能否优化一下SQL语句
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wwwwb 的回复:]

你的SQL语句是什么?
索引情况?
[/Quote]
执行计划已贴出,SQL就是简单的联合查询,单条SQL没有速度问题
wwwwb 2011-09-06
  • 打赏
  • 举报
回复
你的SQL语句是什么?
索引情况?
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 rucypli 的回复:]

你要select出来10w行记录做什么? 没有条件过滤吗 比如分页什么的只要几十行
[/Quote]
有分页,但是也要select出结果排序后才能分页吧
rucypli 2011-09-05
  • 打赏
  • 举报
回复
你要select出来10w行记录做什么? 没有条件过滤吗 比如分页什么的只要几十行
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 acmain_chm 的回复:]

无法提速,估计你用了ORDER BY来排序。 这么多记录需要重新排序会花比较长时间。 建议你直接贴出你的语句。
[/Quote]
不使用order大概要5s左右,SQL只是简单的联合查询
  • 打赏
  • 举报
回复

+----+--------------+--------------+-------------+------------------------------
------------+----------------------------------+---------+---------------+------
+-----------------------------------------------------------------------------+
| id | select_type | table | type | possible_keys
| key | key_len | ref | rows
| Extra |
+----+--------------+--------------+-------------+------------------------------
------------+----------------------------------+---------+---------------+------
+-----------------------------------------------------------------------------+
| 1 | PRIMARY | b | index_merge | PRIMARY,auditing_state,flag,f
reeze_state | flag,auditing_state,freeze_state | 5,5,5 | NULL | 548
| Using intersect(flag,auditing_state,freeze_state); Using where; Using index |

| 1 | PRIMARY | a | ref | Idx_purvey_product,auditing_s
tate | Idx_purvey_product | 9 | chemmade.b.id | 30
| Using where |

| 2 | UNION | b | index_merge | PRIMARY,auditing_state,flag,f
reeze_state | flag,auditing_state,freeze_state | 5,5,5 | NULL | 548
| Using intersect(flag,auditing_state,freeze_state); Using where; Using index |

| 2 | UNION | a | ref | user_id
| user_id | 5 | chemmade.b.id | 4
| Using where |

| 3 | UNION | b | index_merge | PRIMARY,auditing_state,flag,f
reeze_state | flag,auditing_state,freeze_state | 5,5,5 | NULL | 548
| Using intersect(flag,auditing_state,freeze_state); Using where; Using index |

| 3 | UNION | a | ref | user_id
| user_id | 9 | chemmade.b.id | 2
| Using where |

| NULL | UNION RESULT | <union1,2,3> | ALL | NULL
| NULL | NULL | NULL | NUL
L | Using filesort
|
+----+--------------+--------------+-------------+------------------------------
------------+----------------------------------+---------+---------------+------
+-----------------------------------------------------------------------------+
7 rows in set (0.06 sec)
wwwwb 2011-09-05
  • 打赏
  • 举报
回复
EXPLAIN 你的SQL语句
  • 打赏
  • 举报
回复
恩, 才10W条数据,5个字段,真的不算多,不至于7s才跑出来
问题可能出现在什么地方呢
ACMAIN_CHM 2011-09-05
  • 打赏
  • 举报
回复
无法提速,估计你用了ORDER BY来排序。 这么多记录需要重新排序会花比较长时间。 建议你直接贴出你的语句。
聪明的一休 2011-09-05
  • 打赏
  • 举报
回复
其实Union里每句语句的执行和单句执行效率是一样的
就多了最后结果集union的过程,记录多,字段多的话可能耗时就多了,但总觉得你的结果夸张了点
  • 打赏
  • 举报
回复
unoin 后10W条数据
聪明的一休 2011-09-05
  • 打赏
  • 举报
回复
我在本地模拟不出你说的情况

数据10w是指每个表的记录吧,unoin结果大概多少记录呢?

56,675

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧