在 PHP 开发中用到的数据库中 MySQL 是最牛逼的数据库, 没有之一......^_^
相比 SQLite 个人最喜欢的特性就是 "支持多线程, 充分利用 CPU 资源", 不像 SQLite 那样, 动不动就锁死, 导致存储发生异常, 特别是. NET 开发桌面应用时, 为了方便用了 SQLite, 那真的是先甜后苦啊, 有苦说不出的苦.
MySQL 遇到比较多的就是商城系统, 博客系统, 订单和数据存储达到一定量级之后, 会出现慢查询, 这个问题在开发维护过程中谁也躲不过去. 下面是常规的处理方法.
分表是分散数据库压力的好方法.
分表, 最直白的意思, 就是将一个表结构分为多个表, 然后, 可以再同一个库里, 也可以放到不同的库.
当然, 首先要知道什么情况下, 才需要分表. 个人觉得单表记录条数达到百万到千万级别时就要使用分表了.
1, 分表的分类
1 > 纵向分表
将本来可以在同一个表的内容, 人为划分为多个表.(所谓的本来, 是指按照关系型数据库的第三范式要求, 是应该在同一个表的.)
分表理由: 根据数据的活跃度进行分离,(因为不同活跃的数据, 处理方式是不同的)
案例:
对于一个博客系统, 文章标题, 作者, 分类, 创建时间等, 是变化频率慢, 查询次数多, 而且最好有很好的实时性的数据, 我们把它叫做冷数据. 而博客的浏览量, 回复数等, 类似的统计信息, 或者别的变化频率比较高的数据, 我们把它叫做活跃数据. 所以, 在进行数据库结构设计的时候, 就应该考虑分表, 首先是纵向分表的处理.
这样纵向分表后:
首先存储引擎的使用不同, 冷数据使用 MyIsam 可以有更好的查询数据. 活跃数据, 可以使用 Innodb , 可以有更好的更新速度.
其次, 对冷数据进行更多的从库配置, 因为更多的操作时查询, 这样来加快查询速度. 对热数据, 可以相对有更多的主库的横向分表处理.
其实, 对于一些特殊的活跃数据, 也可以考虑使用 memcache ,Redis
之类的缓存, 等累计到一定量再去更新数据库. 或者 MongoDB 一类的 nosql 数据库, 这里只是举例, 就先不说这个.
2 > 横向分表
字面意思, 就可以看出来, 是把大的表结构, 横向切割为同样结构的不同表, 如, 用户信息表, user_1,user_2 等. 表结构是完全一样, 但是, 根据某些特定的规则来划分的表, 如根据用户 ID 来取模划分.
分表理由: 根据数据量的规模来划分, 保证单表的容量不会太大, 从而来保证单表的查询等处理能力.
案例: 同上面的例子, 博客系统. 当博客的量达到很大时候, 就应该采取横向分割来降低每个单表的压力, 来提升性能. 例如博客的冷数据表, 假如分为 100 个表, 当同时有 100 万个用户在浏览时, 如果是单表的话, 会进行 100 万次请求, 而现在分表后, 就可能是每个表进行 1 万个数据的请求 (因为, 不可能绝对的平均, 只是假设), 这样压力就降低了很多很多.
当然特殊情况特殊处理, 有时候慢查询并不一定就是数据库太大导致的, 有可能是组 SQL 的时候语句没有优化好导致的.
MySQL 的慢查询问题
其实通过慢查询日志来分析是一种比较简单的方式, 如果不想看日志, 可以借助工具来完成,
如 mysqldumpslow, mysqlsla, myprofi, MySQL-explain-slow-log, mysqllogfilter 等
下一篇记录优化,
来源: http://www.bubuko.com/infodetail-2974424.html