mysql分表

分表原因

  • mysql执行sql的过程(为了讲解过程方便用)
    1. mysalq sql解析器解析sql(包括检查sql语法等)
    2. 将sql放入排队等待队列
    3. 执行sql
    4. 响应返回结果

这个过程中最花费时间的步骤,还是排队等待时间步骤(2) 和 sql执行时间步骤(3),其实这2个步骤是同一回事。执行快,等待时间自然就少。

  • 表的锁机制
    表的锁机制的目的是保证数据的完整性。
    myisam engine 主要是表级锁
    innodb engine 主要是行级锁

假设有这样的需求,2个sql语句执行同一张表的同一数据,这个时候怎么办?

表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。
行锁定也一样,别的sql必须等我对这条数据操作完。
如果数据太多,一次执行的时间太长,等待的时间就越长。


  • 数据量对mysql性能 当MySQL中一个表的总记录数超过了1000万,会出现性能的大幅度下降吗?答案是肯定的。但性能下降的比率由系统的架构、应用程序、数据库索引、服务器硬件等多种因素而定。数据库多达上亿的数据量,分表之后的单个表也已经突破千万,那么单个表的更新等均影响着系统的运行效率。甚至是一条简单的SQL都有可能压垮整个数据库,如整个表对某个字段的排序操作等。
    基于以上原因,针对海量数据的优化主要有2种方法:大表拆小表的方式、SQL语句的优化。

SQL语句的优化:可以通过增加索引等来调整,但是数据量的增大将会导致索引的维护代价增大。在此不详述,建议大家参考相应的《High Performance MySQL》等书籍。

分表方式

  1,垂直分表:

  对于垂直分表,它将一个N1+N2个字段的表Tab拆分成N1字段的子表Tab1和(N2+1)字段的子表Tab2;其中子表Tab2包含了关于子表Tab1的主键信息,否则两个表的关联关系就会丢失。当然垂直分表会带来程序端SQL的修改,若是应用程序已经应用很长的一段时间,然后程序的升级将是耗时而且易出错的,即升级的代价将会很大。

  2,水平分表:

  水平分区技术将一个表拆成多个表,比较常用的方式是将表中的记录按照某种Hash算法进行拆分,简单的拆分方法如取模方式。同样,这种分区方法也必须对前端的应用程序中的SQL进行修改方可使用。而且对于一个SQL,它可能会修改两个表,那么你必须得写成2个SQL语句从而可以完成一个逻辑的事务,使得程序的判断逻辑越来越复杂,这样也会导致程序的维护代价高,也就失去了采用数据库的优势。因此,分区技术可以有力地避免如上的弊端,成为解决海量数据存储的有力方法。

总结

分表的目的是减小数据库的负担,缩短查询时间。

参看资料
1. http://blog.csdn.net/ithomer/article/details/5136982

你可能感兴趣的:(mysql性能优化)