要解决sql改写或者优化,路由知道后,sql要进行改写或者优化后才能执行。
好比如下场景:
1,查询一个简单的分页,第2条数据开始,第4条数据结束.
不分库下sql:SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_1 x) row_ WHERE rownum<=4) t WHERE t.rownum_>2
水平分库下须要改写为:SELECT * FROM (SELECT row_.*, rownum rownum_ FROM (SELECT x.id FROM table_1 x) row_ WHERE rownum<=4) t WHERE t.rownum_>0
多库下须要从每一个分库下,查出第0条开始,查4条出来进行排序,共8条,而后取排序后的第2到4条。sql
2,分表状况下,没有指定分表路由字段状况下,全部表都要查询一遍,这时候须要改写表名。
不分库下sql:SELECT * FROM table x
在分2个表时须要改写为SELECT * FROM table_0 x; SELECT * FROM table_1 x两条,并行执行两次sql查询,结果归并。函数
3,查询带有order by的时候,须要把记录都查询出来,在内存中进行排序。
这个时候须要select列中包括order by字段,若是是不分库状况下,是不用包括的。
不分库下sql:SELECT balance, account_id FROM table x order by create_time
水平分库下须要改写为 SELECT balance, account_id, create_time FROM table x order by create_time优化
4,查询带有group by的时候,须要把记录都查询出来,在内存中进行排序和分组。
这个时候须要select列中包括group by字段,若是是不分库状况下,是不用包括的。同时这个group by字段要排序,须要把相同的值,作分组统计。
不分库下sql:select SUM(T.UNCASH_AMOUNT) from ACCOUNT t WHERE T.CUSTID LIKE '201304240%' GROUP BY T.CUSTID
水平分库下须要改写为 select SUM(T.UNCASH_AMOUNT),T.CUSTID from ACCOUNT t WHERE T.CUSTID LIKE '201304240%' GROUP BY T.CUSTID ORDER BY T.CUSTID 排序
5,查询带有avg函数的时候。
这个时候须要把avg(uncashamount)改写为sum(uncashamount)/count(uncashamount)。
原始sql:SELECT avg(uncashamount), account_id FROM table x group by account_id
须要改写为 SELECT sum(uncashamount),count(uncashamount), account_id FROM table x group by account_id内存