1
EchoFUN 2012-05-10 15:49:17 +08:00
关注。
|
2
Johnny 2012-05-10 15:57:10 +08:00 1
对于800w的记录真心不多,你打开show-show-sql看下是哪些语句占用太长时间,优化SQL是王道
|
4
eric_zyh OP |
5
holystrike 2012-05-10 16:08:04 +08:00 1
表用innodb引擎,锁行不锁表
对于分表,比较简单常用的策略,就是定量和取模分存 在这个数据量上,要尽量少用join 取模的方式就是对id进行取模运算来看数据是放在哪个表的,订单一类的数据可以考虑用这种 |
6
eric_zyh OP @holystrike 一般多大数据量的表需要分表呢?分表之后一个表记录放多少行记录合适呢?MYSQL有没有一个参考值?
|
7
AlloVince 2012-05-10 16:20:15 +08:00 1
分表之前考虑一下分区的可能,很少有什么查询需要扫描全表的。10W数据一个区,把总查询拆成若干子查询,代价比分表小很多。
|
8
linlinqi 2012-05-10 17:10:33 +08:00 1
大表关联的话,分表也没什么用。趁早拆开
|
9
timchou 2012-05-10 17:14:10 +08:00 1
百万级别的数据,还不到需要考虑分库分表的时候吧。
建议试用innodb存储引擎,buffer pool设置大点,mysql版本可以使用percona 5.5。相信程序换了之后,性能会有很大的改善。 然后slow-log配合观察慢SQL。 最后,如果要考虑分库分表,那就相对比较麻烦了,主要是路由的问题 1)在程序中对主键进行取模,然后人为的定制对应表,这个办法简单,不需要引入中间层,但是扩展性很差。 2)引入比如中间层,淘宝刚刚开源的TDDL就是解决这个问题的。 |
10
kafka0102 2012-05-10 17:21:19 +08:00 1
@eric_zyh 对于表设计,我的经验是
1、不要用join,数据多了一定会有性能问题,表间数据的一致性使用程序保证 2、单表数据如果多于1000万,就可以考虑分表。分表策略通常就是取模,但要提前做好数据量预估,否则再次分表就要重做数据了。如果数据特点简单(比如只是按主健查询),按自增id分表比较合适。 3、如果数据规模并不大但性能还是存在问题,可以有针对性的优化,比如根据慢查询分析问题所在,看是否有其他解决办法。 4、如果是通常的访问模式(比如读多写少),可以考虑主从架构。 5、如果写并发很多,并且写条件不是针对主键的(造成innodb不能按行锁而是锁区间),可以想办法优化,比如异步写,或者分库(分库要谨慎,通常是业务独立的才分库)。 |