DB分布式-兩種方式
1. JDBC擴展
sharding-jdbc: 直接封裝JDBC,代碼遷移成本低,適用於任何連接池及ORM框架,JAR包提供服務,未使用中間層,不用額外部署,DBA無需改變原有運維方式,使用DRUID sql解析器,速度快。
分布策略靈活,SQL解析功能完善,能支持分布式生成全局主鍵,讀寫分離,柔性(努力送達)事物
盜圖

TDDL(taobao data distribute layer):中間層,以jar包形式調用
2. 服務中間件
Amoeba: 獨立中間件服務,用戶鏈接amoeba操作Mysql集群,后端還是jdbc driver
Cobar:后端jdbc driver改為原生的mysql通信協議層,這里將不支持Jdbc規范,但也更具靈活性
Mycat : 增加nio方式,多種聚合,活躍
跨庫分頁-摘自網文,覺得不錯
方法一:全局視野法
(1)將order by time offset X limit Y,改寫成order by time offset 0 limit X+Y
(2)服務層對得到的N*(X+Y)條數據進行內存排序,內存排序后再取偏移量X后的Y條記錄
這種方法隨着翻頁的進行,性能越來越低。
方法二:業務折衷法-禁止跳頁查詢
(1)用正常的方法取得第一頁數據,並得到第一頁記錄的time_max
(2)每次翻頁,將order by time offset X limit Y,改寫成order by time where time>$time_max limit Y
以保證每次只返回一頁數據,性能為常量。
方法三:業務折衷法-允許模糊數據
(1)將order by time offset X limit Y,改寫成order by time offset X/N limit Y/N
方法四:二次查詢法
(1)將order by time offset X limit Y,改寫成order by time offset X/N limit Y
(2)找到最小值time_min
(3)between二次查詢,order by time between $time_min and $time_i_max
(4)設置虛擬time_min,找到time_min在各個分庫的offset,從而得到time_min在全局的offset
(5)得到了time_min在全局的offset,自然得到了全局的offset X limit Y