码迷,mamicode.com
首页 > 数据库 > 详细

MySQL常见问题概览

时间:2017-05-30 15:45:45      阅读:185      评论:0      收藏:0      [点我收藏+]

标签:form   row   from   组织   操作   number   数据库   其他   查询   

最近看了江承尧老师的《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关系。分区主要是通过在集合中进行分组操作,再对集合添加分区列来实现的,在子查询的解决方案中,通过在子查询内部添加相关性,并匹配内部表和外部表的分区列来实现分区。

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

MySQL常见问题概览

标签:form   row   from   组织   操作   number   数据库   其他   查询   

原文地址:http://www.cnblogs.com/stop-Word/p/6920256.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!