Mycat之日志分析 select * from travelrecord order by id limit 100000,100 的执行过程

解释:mycat在执行分页排序的时候,分成2步走.如果M很大,会改写成 limit 0,m+n, 然后在每个MYSQL分片上排序后还需要在mycat汇总输出,所以会很慢。下面是详细执行计划以及日志输出(目前针对这种大分页数据,性能很差,尽量避免,再没有好的优化方案出来之前)

1 先将分页SQL改写分发各个datanode上,变成
SELECT * FROM travelrecord ORDER BY id LIMIT 0, 100100去,
2 然后在mycat端进行汇总
执行elect * from travelrecord order by id limit 100000,10

查看explain执行计划:

mysql> explain select * from travelrecord order by id limit 100000,100 ;
+-----------+--------------------------------------------------------+
| DATA_NODE | SQL                                                    |
+-----------+--------------------------------------------------------+
| dn1       | SELECT * FROM travelrecord ORDER BY id LIMIT 0, 100100 |
| dn2       | SELECT * FROM travelrecord ORDER BY id LIMIT 0, 100100 |
| dn3       | SELECT * FROM travelrecord ORDER BY id LIMIT 0, 100100 |
+-----------+--------------------------------------------------------+
3 rows in set (0.07 sec)

分析mycat日志:

1. 查询缓存以及增加到缓存中,初始化连接,路由SQL,此时已经做了查询写

2. 每个分片上执行改写后的查询SQL,包括datahost,连接信息同步,路由信息

在mycat端进行数据合并,执行原始SQL

posted @ 2017-11-15 18:00  chinesern  阅读(1294)  评论(0编辑  收藏  举报