数据库分库分表
水平切分:将同一个表数据分块保存到不同的数据库
1、产品表(数据量10w,稳定)
2、订单表(数据量200W,且有增长趋势)
3、用户表(数据量100w,且有增长趋势)
如
1、将用户表分成男用户表和女用户表
2、订单表通过已完成和完成中拆分为已完成订单和未完成订单
3、商品表未完成订单放一个server上,已完成订单表和男用户表放一个server上,女用户表放一个server上(女的爱购物,数据增量大)
解决问题:单表中数据量增长出现的压力
不解决的问题:表与表之间的io竞争
垂直切分:就是按功能模块拆分,比如分为订单库,商品库,用户库。垂直切分最大的特点就是简单明了,实施方便。
1、把产品表和用户表放到一个server上,订单表单独放到一个server上
解决问题:表与表之间的io竞争
不解决的问题:但表中数据量增长出现的压力
带来问题:
事务问题
1、分布式事务
2、程序和数据库同步控制
跨点join问题
避免join操作,将操作分成多步完成。在第一次查询的结果集中找出关联数据的id,根据这些id发起第二次请求得到关联数据。
跨节点的count,order by ,group by以及聚合函数的问题
解决方案:与解决跨节点join问题的类似,分别在各个节点上得到结果后在应用程序端进行合并。
sql优化
1、where 避免使用!=或<> 、is null否则将引擎放弃使用索引而进行全表扫描。
2、很多时候用 exists 代替 in 是一个好的选择 (in 里面的查询会创建一张临时表)
索引优化
最左原则
主键一定要索引
where on gourp by order by 的列中使用索引
建议使用区分度高的列建立索引
where 中不能带有逻辑查询索引
为较长的字符串使用前缀索引
mysql索引什么时候不生效?
1.like语句
2.列类型为字符串类型,查询时没有用单引号引起来
3.在where查询语句中使用表达式
4.在where查询语句中对字段进行NULL值判断
5.在where查询中使用了or关键字, myisam表能用到索引, innodb不行;(用UNION替换OR,可以使用索引)
6.全表扫描快于索引扫描(数据量小时)
7.如果是组合索引,不是使用最左原则,索引会失效