MYSQL重点笔记

转载:

从项目管理视角看,将已知风险列出风险应对计划,未知风险越早发现后期付出的代价越小。软件项目中也一样,在产品迭代过程中,尽量将表结构设计优雅一点。 
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锁(排他锁)(可重复读RR和读提交RC都会加间隙锁)。

mysql分表分库 
项目中也有过分表分库,选择了当当网开源中间件sharding-jdbc。 
参考>https://github.com/dangdangdotcom/sharding-jdbc/tree/master 
先收藏关于分表分库原理>http://blog.csdn.net/bluishglc/article/details/6161475/

你可能感兴趣的:(mysql,mysql)