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关系。分区主要是通过在集合中进行分组操作,再对集合添加分区列来实现的,在子查询的解决方案中,通过在子查询内部添加相关性,并匹配内部表和外部表的分区列来实现分区。
这里介绍一种基于临时表的分区解决方案:可以在临时表中创建一个自增长的序列,按照分区的要求将数据插入临时表,需要借助嵌套查询解决问题。