分类目录归档:mysql基础

How to scaled out MySQL DATA

目前大多互联网 公司 数据,随着时间流逝,单实例数据没办法支撑 海量数据的读写。

拆分规则: 垂直和水平。

1. 垂直拆分: 降低业务耦合度,可以将不同业务模块所使用表分拆到不同库中,根据不同类型表来进行拆分,对应用程序影响也更小。

2. 水平拆分: 分为库内分表和分库。水平拆分是根据垂直拆分出来的块进行的再次拆分,而不是针对所有表进行的。另一方面,一些负载较高的系统,即使仅仅只是单个表都无法通过单台数据库主机来支持其负载,意味着需要将垂直和水平拆分联合使用。针对热点数据选着性做水平切分。将整个数据库切分整一个分布式矩阵。

3. 水平拆分所引起的问题:

a1. 事物问题

一. 使用分布式事务

优点: 交由数据库管理,简单。

缺点: 当shard越来越多时,性能代价高。

二   由程序和数据库共同控制

原理:将一个跨多个数据库的分布式事务分拆成多个仅处于单个数据库上面的              小事务,并通过应用程序来总控各个小事务。
优点:性能上有优势
缺点:需要应用程序在事务控制上做灵活设计。如果使用了spring的事务管理,                      改动起来会面临一定的困难。

a2.  跨节点join问题

只要是进行切分,跨节点Join的问题是不可避免的。但是良好的设计和切分却可            以减少此类情况的发生。解决这一问题的普遍做法是分两次查询实现。在第一              次查询的结果集中找出关联数据的id,根据这些id发起第二次请求得到关联数                   据。

a3. 跨节点的count,order by,group by以及聚合函数问题

这些是一类问题,因为它们都需要基于全部数据集合进行计算。多数的代理都              不会自动处理合并工作。解决方案:与解决跨节点join问题的类似,分别在各个             节点上得到结果后在应用程序端进行合并。和join不同的是每个结点的查询可               以并行执行,因此很多时候它的速度要比单一大表快很多。但如果结果集很                 大,对应用程序内存的消耗是一个问题。

 

 

MySQL Index Condition Pushdown

官方原理:

摘抄

http://dev.mysql.com/doc/refman/5.6/en/index-condition-pushdown-optimization.html

To see how this optimization works, consider first how an index scan proceeds when Index Condition Pushdown is not used:

  1. Get the next row, first by reading the index tuple, and then by using the index tuple to locate and read the full table row.
  2. Test the part of the WHERE condition that applies to this table. Accept or reject the row based on the test result.

When Index Condition Pushdown is used, the scan proceeds like this instead:

  1. Get the next row’s index tuple (but not the full table row).
  2. Test the part of the WHERE condition that applies to this table and can be checked using only index columns. If the condition is not satisfied, proceed to the index tuple for the next row.
  3. If the condition is satisfied, use the index tuple to locate and read the full table row.
  4. Test the remaining part of the WHERE condition that applies to this table. Accept or reject the row based on the test result.

Index Condition Pushdown (ICP)是MySQL 5.6 以上 版本中的新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式。

a 当关闭ICP时,index 仅仅是data access 的一种访问方式,存储引擎通过索引回表获取的数据会传递到MySQL Server 层进行where条件过滤。

b 当打开ICP时,如果部分where条件能使用索引中的字段,MySQL Server 会把这部分下推到引擎层,可以利用index过滤的where条件在存储引擎层进行数据过滤,而非将所有通过index access的结果传递到MySQL server层进行where过滤.

优化效果:ICP能减少引擎层访问基表的次数和MySQL Server 访问存储引擎的次数,减少io次数,提高查询语句性能

set optimizer_switch=’index_condition_pushdown=off';