MySQL常见问题概览

最近看了江承尧老师的《MySQL技术内幕:sql编程》,同时结合自己工作中遇到的一些问题,从工程性能以及MySQL本身实际应用出发,总结了一些通过子查询解决的常见问题

1  行号

  MySQL数据库在行号方面的支持并不是十分友好,没有像其他数据库一样提供类似row_number解决方案

  demo1:select  empid ,(select count(1) from sales AS t2 where  t2.empid<=t1.empid) as rownum from salas as t2

  通过子查询解决直观易懂,但是性能很差,每条记录都需要在相关子查询上进行一次查找,生成笛卡尔积。扫描成本0(N^2)

  select emp_no,dept_no,@a:=@a+1 as row_num form dept_emp,(select @a:=0) t 。扫描成本0(N),所以使用交叉连接(cross join)生成行号效率更高

2  分区

  分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。相对于分表,不需要创建子表和配置表之间的union关系。分区主要是通过在集合中进行分组操作,再对集合添加分区列来实现的,在子查询的解决方案中,通过在子查询内部添加相关性,并匹配内部表和外部表的分区列来实现分区。

  这里介绍一种基于临时表的分区解决方案:可以在临时表中创建一个自增长的序列,按照分区的要求将数据插入临时表,需要借助嵌套查询解决问题。

转载于:https://www.cnblogs.com/stop-Word/p/6920256.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值