MySQL 分库分表的方案
1️⃣ 用户请求量太大 因为单服务器TPS、内存、IO都是有限的。 ✅ 解决方法是分散请求到多个服务器上。(划分服务) 2️⃣ 单个数据库太大 单个数据库处理能力有限;单库所在服务器上磁盘空间不足;单库上操作的IO瓶颈。 ✅ 解决方法是切分成更多更小的库。(划分库) 3️⃣ 单个数据表太大 CRUD都成问题,索引膨胀,查询超时。 ✅ 解决方法是切分成多个数据集更小的表。(划分表)
1️⃣ 用户请求量太大 因为单服务器TPS、内存、IO都是有限的。 ✅ 解决方法是分散请求到多个服务器上。(划分服务) 2️⃣ 单个数据库太大 单个数据库处理能力有限;单库所在服务器上磁盘空间不足;单库上操作的IO瓶颈。 ✅ 解决方法是切分成更多更小的库。(划分库) 3️⃣ 单个数据表太大 CRUD都成问题,索引膨胀,查询超时。 ✅ 解决方法是切分成多个数据集更小的表。(划分表)
在联合索引时,一定会碰到并用到最左匹配原则。所谓最左匹配原则,就是你的SQL语句中用到了联合索引中的最左边的索引,那么这条SQL语句就可以利用这个联合索引去进行匹配。不仅仅MySQL支持联合索引的最左匹配原则,MongoDB数据库也支持。 值得注意的是,当遇到范围查询时候,例如>,<,between,like,索引就会停止匹配。 组合索引 - composite index 最左匹配原则 - leftmost prefix principle 案例说明 例如对(a,b,c,d)字段建立索引,使用where如下,就是可以匹配索引的。 1 2 3 a = 1 a = 1 AND b = 2 b = 1 AND a = 1 # MySQL优化器会自动调整a和b的顺序,保持与索引顺序一致。 但是如果执行如下,那么将无法命中匹配索引。 1 2 b = 2 # b有序的前提是a有序,如果a无法确定,那么在B+树里肯定也是无序的,所以不能命中匹配索引。 a = 1 AND b = 2 AND c > 3 AND d = 4 # a和b和c可以命中索引,但是d因为遇到了范围查询,故无法命中索引