mysql笔记
http://blog.csdn.net/aacm1992/article/details/53025747
转载:
从项目管理视角看,将已知风险列出风险应对计划,未知风险越早发现后期付出的代价越小。软件项目中也一样,在产品迭代过程中,尽量将表结构设计优雅一点。
msyql设计
MySQL单表存储大数据时考虑如下方面:
1. 考虑旧数据归档,让单表数据尽量少
2. 考虑数据冷热,比如某些字段访问频繁,某些恰相反,结合业务情况考虑主表与附属表设计(或后期的垂直拆分)
3. 水平拆分
当整个业务都庞大后,考虑部分功能做成服务,单独部署。
mysql优化
单表数据量大时,sql语句的优化也尤为重要。处于主角地位的就是索引。在表结构设计是索引必不可少,除非数据量非常少。
sql语句尽量走索引,索引遵循‘最左前缀‘原则。
为什么?--索引在mysql innodb就是b-tree。学过二叉树查找的就知道,它是顺序的。
具体可以参考> http://outofmemory.cn/mysql/mysql-index-arithmetic
列一下where条件下那些情况走索引,哪些没有(遵循最左前缀匹配原则下):
- =,in,between…and,like (前缀有模糊不算eg:’abc%’ :yes , ‘%abc%’: no)
- >, < (范围查询,只能最左边的索引有用eg: a>2 and b>2 ,只会用到a索引)
- or条件,函数,表达式 都不走索引
可参考> http://blog.jobbole.com/87107/
mysql锁机制
innodb中使用行锁(记录锁)。两种常用事务隔离级别:Repeatable Read(可重复读:不出现幻读):不仅有记录锁,还有间隙锁,锁住可能影响的前后范围纪录。
Read Committed(读提交:事务处理过程中可能有其它提交,同一select可能返回不同结果,出现幻读):记录锁,锁住当前更改纪录。
delete,insert,update,特殊的select会加锁。
曾经碰到出现间隙锁导致死锁情况,需要注意:
(1)间隙锁只会block住insert操作;
(2)若where条件走主键索引或唯一索引,不会产生间隙锁;
(3)若where条件不走索引,则会对所有记录加上X锁(排他锁),并对记录之间应用间隙锁,相当于全表锁
mysql分表分库
项目中也有过分表分库,选择了当当网开源中间件sharding-jdbc。
参考>https://github.com/dangdangdotcom/sharding-jdbc/tree/master
先收藏关于分表分库原理>http://blog.csdn.net/bluishglc/article/details/6161475/