??xml version="1.0" encoding="utf-8" standalone="yes"?>
׃n?br />׃n锁的代号是SQ是Share的羃写,׃n锁的锁粒度是行或者元l(多个行)。一个事务获取了׃n锁之后,可以寚w定范围内的数据执行读操作?
排它?br />排它锁的代号是XQ是eXclusive的羃写,排它锁的_度与共享锁相同Q也是行或者元l。一个事务获取了排它锁之后,可以寚w定范围内的数据执行写操作?br />
假设有两个事务t1和t2
如果事务t1获取了一个元l的׃n锁,事务t2q可以立卌取这个元l的׃n锁,但不能立卌取这个元l的排它锁(必须{到t1释放׃n锁之后)?br />如果事务t1获取了一个元l的排它锁,事务t2不能立即获取q个元组的排׃n锁,也不能立卌取这个元l的排它锁(必须{到t1释放排它锁之后)?br />
意向?br />意向锁是一U表锁,锁定的粒度是整张表,分ؓ意向׃n?IS)和意向排它锁(IX)两类。意向共享锁表示一个事务有意对数据上共享锁或者排它锁?#8220;有意”q两个字表达的意思比较微妙,说的明白点就是指事务惛_q个事但q没真去qӀD例说明下意向׃n锁,比如一个事务t执行了这样一个语句:select * from table lock in share model Q如果这个语句执行成功,对表table上了一个意向共享锁。lock in share model是说事务t1在接下来要执行的语句中要获取S锁。如果t1的select * from table lock in share model执行成功Q那么接下来t1应该可以畅通无ȝL行只需要共享锁的语句了。意向排它锁的含义同理可知,上例中要获取意向排它锁,可以使用select * from table for update ?br />
lock in share model ?for updateq两?/span>东西在数据率理论中还有个学名?/span>悲观锁,与悲观锁相对的当然还有乐观锁。大家可以看到各U锁都是成双成对出现的。关于悲观锁和乐观锁的问题暂且不表,下文再来详述?
锁的互斥与兼容关p?/span>
锁和锁之间的关系Q要么是相容的,要么是互斥的?br />锁a和锁b相容是指Q操作同样一l数据时Q如果事务t1获取了锁a,另一个事务t2q可以获取锁bQ?br />锁a和锁b互斥是指Q操作同样一l数据时Q如果事务t1获取了锁aQ另一个事务t2在t1释放锁a之前无法获取锁b?br />
上面提到的共享锁、排它锁、意向共享锁、意向排它锁怺之前都是有兼?互斥关系的,可以用一个兼Ҏ矩阵表C?y表示兼容Qn表示不兼?:
X S IX IS
X n n n n
S n y n y
IX n n y y
IS n y y y
兼容性矩阵ؓ什么是q个样子的?
X和S的相互关pd上文中解释过了,IX和IS的相互关pd部是兼容Q这也很好理解,因ؓ它们都只?#8220;有意”Q还处于YY阶段Q没有真qԌ所以是可以兼容的;
剩下的就是X和IXQX和IS, S和IXQ?S和IS的关pMQ我们可以由X和S的关pL导出q四l关pR?br />单的_X和IX?X和X的关pRؓ什么呢Q因Z务在获取IX锁后Q接下来有权利获取X锁。如果X和IX兼容的话Q就会出C个事务都获取了X锁的情况Q这与我们已知的X与X互斥是矛盄Q所以X与IX只能是互斥关pR其余的三组关系同理Q可用同L方式推导出来?br />
一致性非d?br />
select... lock in share mode和select ... for update的区?br />
索引记录?br />
各种语句对应的锁cd
在有索引的情况下是以后码锁ؓ基础的行U锁Q在固定索引键查扄情况下是索引记录锁,在没有可用烦引的情况下上升到表锁
有烦引的情况Q?br />select ... from 一致性非d读,不上锁。在serializable隔离U别下例外,在这个隔ȝ别下上共享后码锁
select ... from ... lock in share mode ׃n后码?
select ... from ... for update 排它后码?br />update .... where 排它后码?br />delete from .... where 排它后码?br />insert ... 排它索引记录锁,如果发生键值唯一性冲H则转成׃n?br />insert ... on duplicate key update Q一直都是排它锁
replace ... 一直都是排它锁
死锁情境分析
MVCC的理Z实现
]]>
2. 定位性能瓉
profiling
3. 明确的优化目?br />
4. 从explain入手
y
5. 结果集驱动大结果集Q?
Join操作
6. 在烦引中完成排序
7. 只取己需要的columns
MySQL有两U排序算法,可能用只讉K一ơ数据的法?br />
8. 仅仅使用最有效的过滤条?br />索引键长度?
9. 避免复杂的join和子查询
充分利用EXPLAIN和profiling
profiling的用:
1.set profiling = 1;
2.执行SQL;
3.show profile;
4.show profile [cpu, block io] for query [id];
mysqlslap 试sql性能
t * from hbe_hotel" --create-schema=phoenix -uroot -p
合理设计q用烦?br />Mysql支持的烦引类型:
1. B-tree索引 除了Archive的存储引擎都支持
2. Hash索引 memory和NDB支持
3. Full-text索引 MyISAMQ分词后建立B-tree索引
4. R-tree索引 MyISAM QGISpȝ使用
索引的利?br />利:提高数据索效率和排序、分l效?br />弊:加大更新操作的资源消耗,增加存储I间的消?br />
如何判断是否需要用烦?br />1. 使用较频J的字段应该创徏索引
2. 唯一性太差的字段不徏索引 l验|15%
3. 更新非常频繁的字D不建烦?br />4. where子句中不出现的字D不建烦?br />
单键索引q是l合索引Q?br />多方考虑Q^衡优?br />
技术h员如何证明一个需求是否合理?
1. 每次PD提出新需求的时候,要求l出该项目预期收益的量化指标?br />2. 在项目进行中Q详l记录所有资源投入,包括人力、硬件等?br />3. 目上线后收集数据统计实际收益倹{?br />4. 相关部门可能设计出目投入/产出比率的计规则,投?产出比公布给参与目的所有h员?br />5. 比较实际的投?产出比与预期|以判定项目做的是否值得?br />
]]>
调用方式Q?br />explain select ...
explain extended select ...
show warnings 得到MySQL优化器优化后的查询语?br />
执行计划包含的信息:
说明Q?br />idQ?select子句的优先Qid大Q优先高?br />select_type: 查询cd
table: 查询的表?br />type: MySQL扑ֈ所需行用的方式Q包括如下类型:
ALL: 扫描全表
index: 扫描全部索引?br />range: 扫描部分索引
ref: 非唯一性烦引扫?br />eq_refQ唯一性烦引扫?br />const, system: ?/span>MySQLҎ询某部分q行优化Qƈ转换Z个常量时Q用这些类型访?/span>
NULL: MySQL在优化过E中分解语句Q执行时甚至不用讉K表或索引
rows: 扑ֈ所需记录需要读取的行数
Extra: 额外信息
执行计划可用来分析select语句的性能Q排查性能瓉?br />
参考资料:
http://wenku.baidu.com/view/d4416c27aaea998fcc220ea7.html
/Files/neverend/mysqlexplain-MySQL执行计划解读.ppt
]]>
如何merge代码?
用命令搞mergeQ客L囑Ş界面不是很给力?br />SVN 1.5以上版本Q可以用SVN的自动合qӞ
主q合q到分支Q?br />q入分支目录Q执行命令: svn merge http://server/dir/trunk
分支合q到dQ?br />q入d目录Q执行命令: svn merge http://server/dir/branch --reintegrate
注: 如果之前q行q主q合q到分支的操作,请加参数--reintegrateQ否则可能会有很多代码冲H出现?br />
如果是SVN1.5以下版本Q只能用手工合qӞq入d目录Q执行命令:svn merge -r version1:version2 http://server/dir/branch
branch上从version1到version2所做的改动合ƈCqԌvension1 < version2
q入d目录Q执行命令: svn merge -c version1 http://server/dir/branch
表示version1ơ所做的改动合ƈCq?br />
conficted
tree conficted
]]>
maven依赖冲突的生是由maven传递性依赖造成的:
什么是maven传递依赖?
“一个传递性依赖就是对于一个依赖的依赖。如果project-a依赖于project-bQ而后
者接着依赖于project-cQ那么project-cp认ؓ是project-a的传递性依赖。如
果project-c依赖于project-dQ那么project-d׃被认为是project-a的传递性依
赖。Maven的部分吸引力是由于它能够理传递性依赖,q且能够帮助开发者屏蔽掉?br />t所有编译期和运行期依赖的细节。你可以只依赖于一些包如Spring FrameworkQ而不
用担心Spring Framework的所有依赖,Maven帮你自动理了,你不用自己去详细了解
配置?br />Maven是怎样完成qg事情的呢Q它建立一个依赖图Qƈ且处理一些可能发生的冲突?br />重叠。例如,如果Maven看到有两个项目依赖于同样的groupId和artifactIdQ它会自?br />整理Z用哪个依赖,选择那个最新版本的依赖。虽然这听v来很方便Q但在一些边?br />情况中,传递性依赖会造成一些配|问题。在q种情况下,你可以用依赖排除?#8221;
——摘自《Maven权威指南?br />
什么情况下会生依赖冲H?
举例说明Q项目中的pom.xml里声明了对project-a1.0与project-b2.0的依赖,而project-a1.0又传递依赖于project-b1.0的版本?br />假设mavenl过分析之后军_使用project-b1.0的依赖,也就是打包的时候把project-b1.0.jar打进了war包?br />war包部|在java容器中启动之后,如果依赖project-b2.0.jar中新ȝcLҎQ就会发现引用的cL者方法不存在?br />q种现象是依赖冲突?br />
如何分析依赖冲突Q?br />mvn dependency:tree
冲突解决ҎQ?br />使用maven提供?lt;exclusion>标签?br />举例说明Q?br />如果你正依赖于一个类库,该类库又依赖于Sun JTA APIQ你会想要替换这个传递性依赖?br />Hibernate是一个例子。Hibernate依赖于Sun JTA APIQ而后者在中央Maven仓库中不可用Q因为它是不
能免费分发的。幸q的是,Apache Gernoimo目创徏了一些可以免费分发的独立实现
cd。ؓ了用另外的依赖来替换q个传递性依赖,你需要排除这个传递性以依赖Q然?br />在你的项目中再声明一个依赖。下面展CZq样一个替换的样例?
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.5.ga</version>
<exclusions>
<exclusion>
<groupId>javax.transaction</groupId>
<artifactId>jta</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.geronimo.specs</groupId>
<artifactId>geronimo-jta_1.1_spec</artifactId>
<version>1.1</version>
</dependency>
]]>
死锁分析
]]>
]]>
?etc/init.d/目录下新建文件tomcatQ输入如下内容:
#! /bin/sh
# This shell script enables the automatic use of tomcat
#
# Author: liuxuanyu<neverend06@163.com>
#
RETVAL=0
start() {
echo -n "Tomcat Starting..."
echo
$TOMCAT_HOME/bin/startup.sh
}
stop() {
echo -n "Tomcat Stop..."
echo
$TOMCAT_HOME/bin/shutdown.sh
}
restart() {
echo -n "Tomcat restart..."
echo
stop
start
}
case "$1" in
start)
start;;
stop)
stop;;
restart)
restart;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit $RETVAL
使用ҎQ?br />sudo /etc/init.d/tomcat start
sudo /etc/init.d/tomcat stop
sudo /etc/init.d/tomcat restart