[TODO list]HTTPS的前生后世
Java递归文件读取文件内容并追加写到另一个文件中
【线程九】Java内存模型是什么
Java内存模型规定和指引Java程序在不同的内存架构、CPU和操作系统间有确定性地行为。它在多线程的情况下尤其重要。Java内存模型对一个线程所做的变动能被其它线程可见提供了保证,它们之间是先行发生关系。这个关系定义了一些规则让程序员在并发编程时思路更清晰。比如,先行发生关系确保了:
- 线程内的代码能够按先后顺序执行,这被称为程序次序规则。
- 对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则。
- 前一个对volatile的写操作在后一个volatile的读操作之前,也叫volatile变量规则。
- 一个线程内的任何操作必需在这个线程的start()调用之后,也叫作线程启动规则。
- 一个线程的所有操作都会在线程终止之前,线程终止规则。
- 一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。
- 可传递性
我强烈建议大家阅读《Java并发编程实践》(电子书有需要请留言)第十六章来加深对Java内存模型的理解。
PHP如何使用http curl 传输数据
引言
之前从未写过这门全世界最好的语言,这两天因业务所需,研究了下,感觉还好。 然后在使用过程中看到有人提问类似业务内容,索性写出来了。搭建php环境
搭建httpd
搭建mysql
开始php第一个hello world
在/var/www/html中创建index.php 写上 [crayon-564208032bf51303526081/]使用php进行curl 操作
数据格式就按照给定的 [crayon-564208032bf5a680702048/] 首先我们先要明白这到底是什么鬼 curl代表linux命令Content-type: application/json:代表header
POST 提交方式
"http://xxx" 提交url
提交数据:
[crayon-564208032bf60182953242/]然后又查php手册,看如何使用
首先要安装http 扩展
然后demo如下
[crayon-564208032bf65786544452/] 这个示例还是非常容易理解的 只不过他的header不同 转为自己所需要格式 照猫画虎写一个整理如下
[crayon-564208032bf6a573587888/] 结果:成功! 总结 这个例子一做下来,发现使用这货还可以做爬虫,包括一般爬取和提交表单爬数据。 并且在做的过程中真的写了一个小爬虫程序,有机会分享出来。真是又学了一招Eclipse Maven 错误 “Failure to transfer…”Failure to transfer org.apache.maven.plugins:maven-compiler-plugin:pom:2.0.2 from http://repo1.maven.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.apache.maven.plugins:maven-compiler-plugin:pom:2.0.2 from/to central (http://repo1.maven.org/maven2): No response received after 60000 ExampleProject Unknown Maven Problem
Failed to read candidate component class包冲突解决方法
Failed to connect to 127.0.0.1:27017 reason: errno:111 connection attempt failed at src/mongo/shell/mongo.js:146
背景
今天打开mongo, 结果在命令行输入mongo后,报错如下 [crayon-564208032b636493383326/]解决方法
四步1) Remove .lock file
[crayon-564208032b640613696661/]2) repair the mongodb
[crayon-564208032b645610120656/]3) start the mongodb
[crayon-564208032b64a808781582/]4) start the mongo client
[crayon-564208032b64f493438884/]更多细节
http://shakthydoss.com/error-couldnt-connect-to-server-127-0-0-127017-srcmongoshellmongo-js-exception-connect-failed/如何使用httpclient4 发送json数据到hubspot hubapi
红色黄色黑色绿色十六进制颜色码
LightPink |
浅粉色 |
#FFB6C1 |
255,182,193 |
Pink |
粉红 |
#FFC0CB |
255,192,203 |
Crimson |
猩红 |
#DC143C |
220,20,60 |
LavenderBlush |
脸红的淡紫色 |
#FFF0F5 |
255,240,245 |
PaleVioletRed |
苍白的紫罗兰红色 |
#DB7093 |
219,112,147 |
HotPink |
热情的粉红 |
#FF69B4 |
255,105,180 |
DeepPink |
深粉色 |
#FF1493 |
255,20,147 |
MediumVioletRed |
适中的紫罗兰红色 |
#C71585 |
199,21,133 |
Orchid |
兰花的紫色 |
#DA70D6 |
218,112,214 |
Thistle |
蓟 |
#D8BFD8 |
216,191,216 |
plum |
李子 |
#DDA0DD |
221,160,221 |
Violet |
紫罗兰 |
#EE82EE |
238,130,238 |
Magenta |
洋红 |
#FF00FF |
255,0,255 |
Fuchsia |
灯笼海棠(紫红色) |
#FF00FF |
255,0,255 |
DarkMagenta |
深洋红色 |
#8B008B |
139,0,139 |
Purple |
紫色 |
#800080 |
128,0,128 |
MediumOrchid |
适中的兰花紫 |
#BA55D3 |
186,85,211 |
DarkVoilet |
深紫罗兰色 |
#9400D3 |
148,0,211 |
DarkOrchid |
深兰花紫 |
#9932CC |
153,50,204 |
Indigo |
靛青 |
#4B0082 |
75,0,130 |
BlueViolet |
深紫罗兰的蓝色 |
#8A2BE2 |
138,43,226 |
MediumPurple |
适中的紫色 |
#9370DB |
147,112,219 |
MediumSlateBlue |
适中的板岩暗蓝灰色 |
#7B68EE |
123,104,238 |
SlateBlue |
板岩暗蓝灰色 |
#6A5ACD |
106,90,205 |
DarkSlateBlue |
深岩暗蓝灰色 |
#483D8B |
72,61,139 |
Lavender |
薰衣草花的淡紫色 |
#E6E6FA |
230,230,250 |
GhostWhite |
幽灵的白色 |
#F8F8FF |
248,248,255 |
Blue |
纯蓝 |
#0000FF |
0,0,255 |
MediumBlue |
适中的蓝色 |
#0000CD |
0,0,205 |
MidnightBlue |
午夜的蓝色 |
#191970 |
25,25,112 |
DarkBlue |
深蓝色 |
#00008B |
0,0,139 |
Navy |
海军蓝 |
#000080 |
0,0,128 |
RoyalBlue |
皇军蓝 |
#4169E1 |
65,105,225 |
CornflowerBlue |
矢车菊的蓝色 |
#6495ED |
100,149,237 |
LightSteelBlue |
淡钢蓝 |
#B0C4DE |
176,196,222 |
LightSlateGray |
浅石板灰 |
#778899 |
119,136,153 |
SlateGray |
石板灰 |
#708090 |
112,128,144 |
DoderBlue |
道奇蓝 |
#1E90FF |
30,144,255 |
AliceBlue |
爱丽丝蓝 |
#F0F8FF |
240,248,255 |
SteelBlue |
钢蓝 |
#4682B4 |
70,130,180 |
LightSkyBlue |
淡蓝色 |
#87CEFA |
135,206,250 |
SkyBlue |
天蓝色 |
#87CEEB |
135,206,235 |
DeepSkyBlue |
深天蓝 |
#00BFFF |
0,191,255 |
LightBLue |
淡蓝 |
#ADD8E6 |
173,216,230 |
PowDerBlue |
火药蓝 |
#B0E0E6 |
176,224,230 |
CadetBlue |
军校蓝 |
#5F9EA0 |
95,158,160 |
Azure |
蔚蓝色 |
#F0FFFF |
240,255,255 |
LightCyan |
淡青色 |
#E1FFFF |
225,255,255 |
PaleTurquoise |
苍白的绿宝石 |
#AFEEEE |
175,238,238 |
Cyan |
青色 |
#00FFFF |
0,255,255 |
Aqua |
水绿色 |
#00FFFF |
0,255,255 |
DarkTurquoise |
深绿宝石 |
#00CED1 |
0,206,209 |
DarkSlateGray |
深石板灰 |
#2F4F4F |
47,79,79 |
DarkCyan |
深青色 |
#008B8B |
0,139,139 |
Teal |
水鸭色 |
#008080 |
0,128,128 |
MediumTurquoise |
适中的绿宝石 |
#48D1CC |
72,209,204 |
LightSeaGreen |
浅海洋绿 |
#20B2AA |
32,178,170 |
Turquoise |
绿宝石 |
#40E0D0 |
64,224,208 |
Auqamarin |
绿玉\碧绿色 |
#7FFFAA |
127,255,170 |
MediumAquamarine |
适中的碧绿色 |
#00FA9A |
0,250,154 |
MediumSpringGreen |
适中的春天的绿色 |
#F5FFFA |
245,255,250 |
MintCream |
薄荷奶油 |
#00FF7F |
0,255,127 |
SpringGreen |
春天的绿色 |
#3CB371 |
60,179,113 |
SeaGreen |
海洋绿 |
#2E8B57 |
46,139,87 |
Honeydew |
蜂蜜 |
#F0FFF0 |
240,255,240 |
LightGreen |
淡绿色 |
#90EE90 |
144,238,144 |
PaleGreen |
苍白的绿色 |
#98FB98 |
152,251,152 |
DarkSeaGreen |
深海洋绿 |
#8FBC8F |
143,188,143 |
LimeGreen |
酸橙绿 |
#32CD32 |
50,205,50 |
Lime |
酸橙色 |
#00FF00 |
0,255,0 |
ForestGreen |
森林绿 |
#228B22 |
34,139,34 |
Green |
纯绿 |
#008000 |
0,128,0 |
DarkGreen |
深绿色 |
#006400 |
0,100,0 |
Chartreuse |
查特酒绿 |
#7FFF00 |
127,255,0 |
LawnGreen |
草坪绿 |
#7CFC00 |
124,252,0 |
GreenYellow |
绿黄色 |
#ADFF2F |
173,255,47 |
OliveDrab |
橄榄土褐色 |
#556B2F |
85,107,47 |
Beige |
米色(浅褐色) |
#6B8E23 |
107,142,35 |
LightGoldenrodYellow |
浅秋麒麟黄 |
#FAFAD2 |
250,250,210 |
Ivory |
象牙色 |
#FFFFF0 |
255,255,240 |
LightYellow |
浅黄色 |
#FFFFE0 |
255,255,224 |
Yellow |
纯黄 |
#FFFF00 |
255,255,0 |
Olive |
橄榄 |
#808000 |
128,128,0 |
DarkKhaki |
深卡其布 |
#BDB76B |
189,183,107 |
LemonChiffon |
柠檬薄纱 |
#FFFACD |
255,250,205 |
PaleGodenrod |
灰秋麒麟 |
#EEE8AA |
238,232,170 |
Khaki |
卡其布 |
#F0E68C |
240,230,140 |
Gold |
金 |
#FFD700 |
255,215,0 |
Cornislk |
玉米色 |
#FFF8DC |
255,248,220 |
GoldEnrod |
秋麒麟 |
#DAA520 |
218,165,32 |
FloralWhite |
花的白色 |
#FFFAF0 |
255,250,240 |
OldLace |
老饰带 |
#FDF5E6 |
253,245,230 |
Wheat |
小麦色 |
#F5DEB3 |
245,222,179 |
Moccasin |
鹿皮鞋 |
#FFE4B5 |
255,228,181 |
Orange |
橙色 |
#FFA500 |
255,165,0 |
PapayaWhip |
番木瓜 |
#FFEFD5 |
255,239,213 |
BlanchedAlmond |
漂白的杏仁 |
#FFEBCD |
255,235,205 |
NavajoWhite |
Navajo白 |
#FFDEAD |
255,222,173 |
AntiqueWhite |
古代的白色 |
#FAEBD7 |
250,235,215 |
Tan |
晒黑 |
#D2B48C |
210,180,140 |
BrulyWood |
结实的树 |
#DEB887 |
222,184,135 |
Bisque |
(浓汤)乳脂,番茄等 |
#FFE4C4 |
255,228,196 |
DarkOrange |
深橙色 |
#FF8C00 |
255,140,0 |
Linen |
亚麻布 |
#FAF0E6 |
250,240,230 |
Peru |
秘鲁 |
#CD853F |
205,133,63 |
PeachPuff |
桃色 |
#FFDAB9 |
255,218,185 |
SandyBrown |
沙棕色 |
#F4A460 |
244,164,96 |
Chocolate |
巧克力 |
#D2691E |
210,105,30 |
SaddleBrown |
马鞍棕色 |
#8B4513 |
139,69,19 |
SeaShell |
海贝壳 |
#FFF5EE |
255,245,238 |
Sienna |
黄土赭色 |
#A0522D |
160,82,45 |
LightSalmon |
浅鲜肉(鲑鱼)色 |
#FFA07A |
255,160,122 |
Coral |
珊瑚 |
#FF7F50 |
255,127,80 |
OrangeRed |
橙红色 |
#FF4500 |
255,69,0 |
DarkSalmon |
深鲜肉(鲑鱼)色 |
#E9967A |
233,150,122 |
Tomato |
番茄 |
#FF6347 |
255,99,71 |
MistyRose |
薄雾玫瑰 |
#FFE4E1 |
255,228,225 |
Salmon |
鲜肉(鲑鱼)色 |
#FA8072 |
250,128,114 |
Snow |
雪 |
#FFFAFA |
255,250,250 |
LightCoral |
淡珊瑚色 |
#F08080 |
240,128,128 |
RosyBrown |
玫瑰棕色 |
#BC8F8F |
188,143,143 |
IndianRed |
印度红 |
#CD5C5C |
205,92,92 |
Red |
纯红 |
#FF0000 |
255,0,0 |
Brown |
棕色 |
#A52A2A |
165,42,42 |
FireBrick |
耐火砖 |
#B22222 |
178,34,34 |
DarkRed |
深红色 |
#8B0000 |
139,0,0 |
Maroon |
栗色 |
#800000 |
128,0,0 |
White |
纯白 |
#FFFFFF |
255,255,255 |
WhiteSmoke |
白烟 |
#F5F5F5 |
245,245,245 |
Gainsboro |
Gainsboro |
#DCDCDC |
220,220,220 |
LightGrey |
浅灰色 |
#D3D3D3 |
211,211,211 |
Silver |
银白色 |
#C0C0C0 |
192,192,192 |
DarkGray |
深灰色 |
#A9A9A9 |
169,169,169 |
Gray |
灰色 |
#808080 |
128,128,128 |
DimGray |
暗淡的灰色 |
#696969 |
105,105,105 |
Black |
纯黑 |
#000000 |
0,0,0 |
Java 定时 quzrtz CronTrigger配置格式
序号 | 说明 | 是否必填 | 允许填写的值 | 允许的通配符 |
1 | 秒 | 是 | 0-59 | , - * / |
2 | 分 | 是 | 0-59 | , - * / |
3 | 小时 | 是 | 0-23 | , - * / |
4 | 日 | 是 | 1-31 | , - * ? / L W |
5 | 月 | 是 | 1-12 or JAN-DEC | , - * / |
6 | 周 | 是 | 1-7 or SUN-SAT | , - * ? / L # |
7 | 年 | 否 | empty 或 1970-2099 | , - * / |
小提示 | 'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发(一般指发工资 ) |
小提示 | 周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同. |
0 0 12 * * ? | 每天12点触发 |
0 15 10 ? * * | 每天10点15分触发 |
0 15 10 * * ? | 每天10点15分触发 |
0 15 10 * * ? * | 每天10点15分触发 |
0 15 10 * * ? 2005 | 2005年每天10点15分触发 |
0 * 14 * * ? | 每天下午的 2点到2点59分每分触发 |
0 0/5 14 * * ? | 每天下午的 2点到2点59分(整点开始,每隔5分触发) |
0 0/5 14,18 * * ? | 每天下午的 2点到2点59分(整点开始,每隔5分触发) 每天下午的 18点到18点59分(整点开始,每隔5分触发) |
0 0-5 14 * * ? | 每天下午的 2点到2点05分每分触发 |
0 10,44 14 ? 3 WED | 3月分每周三下午的 2点10分和2点44分触发 |
0 15 10 ? * MON-FRI | 从周一到周五每天上午的10点15分触发 |
0 15 10 15 * ? | 每月15号上午10点15分触发 |
0 15 10 L * ? | 每月最后一天的10点15分触发 |
0 15 10 ? * 6L | 每月最后一周的星期五的10点15分触发 |
0 15 10 ? * 6L 2002-2005 | 从2002年到2005年每月最后一周的星期五的10点15分触发 |
0 15 10 ? * 6#3 | 每月的第三周的星期五开始触发 |
0 0 12 1/5 * ? | 每月的第一个中午开始每隔5天触发一次 |
0 11 11 11 11 ? | 每年的11月11号 11点11分触发(光棍节) |
【线程八•2】JAVA中COUNTDOWNLATCH使用demo
end.await(1,TimeUnit.SECONDS);
如果执行后,1秒没有完成,他就等不及了,会直接宣布结束,但是后面的线程依然会执行Game Start
No.7 arrived
Game Over
No.8 arrived
No.10 arrived
No.9 arrived
No.6 arrived
No.2 arrived
No.1 arrived
No.3 arrived
No.5 arrived
No.4 arrived
2.3. 关于2.2中TimeUnit的用法,可以点进去看API说明。有很多实用方法。
System.out.println(TimeUnit.SECONDS.convert(1, TimeUnit.MINUTES));
输出:1 分钟转60秒
System.out.println(TimeUnit.SECONDS.toMinutes(600));
输出:600秒转10Minutes
3 ExecutorService用法
3.1 Executors.newFixedThreadPool(10);
3.2 exec.submit(run);(与exec.execute(run);区别)
将Runnable的对象传递给ExecutorService的submit方法,则该run方法自动在一个线程上执行,并且会返回执行结果Future对象,但是在该Future对象上调用get方法,将返回null。
3.3 exec.shutdown();
4 源码解析
Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例 - 如果天空不死 - 博客园 http://www.cnblogs.com/skywang12345/p/3533887.html
Could not autowire field ResourceBundleMessageSource
Could not autowire field: org.springframework.context.support.ResourceBundleMessageSource
[crayon-5657971031eca310782153/] 错误说得明显。 找到xxx-context.xml,添加 [crayon-5657971031eda368573115/]安装rabbitmq
##如果装不上erlang wget -O /etc/yum.repos.d/erlang_solutions.repo http://binaries.erlang-solutions.com/rpm/centos/erlang_solutions.repo 再装 rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc |
- 添加外部访问
[{rabbit, [{loopback_users, []}]}]. |
- 配置集群
【线程十】【翻译●中英双语】Java中的volatile 变量是什么
- volatilekeyword in Java is only application to variable and using volatile keyword with class and method is illegal.
- volatilekeyword in Java guarantees that value of volatile variable will always be read from main memory and not from Thread's local cache.
- In Java reads and writes areatomicfor all variables declared using Java volatile keyword (including long and double variables).
- Using Volatilekeywordin Java on variables reduces the risk of memory consistency errors, because any write to a volatile variable in Java establishes a happens-before relationship with subsequent reads of that same variable.
- From Java 5 changes to a volatile variable are always visible to other threads. What’s more it also means that when a thread reads a volatile variable in Java, it sees not just the latest change to the volatile variable but also the side effects of the code that led up the change.
- Reads and writes are atomic for reference variables are for most primitive variables (all types except long and double) even without use of volatilekeywordin Java.
- An access to a volatile variable in Java never has chance to block, since we are only doing a simple read or write, so unlike a synchronized block we will never hold on to any lock or wait for anylock.
- Java volatile variable that is an object reference may be null.
- Java volatilekeyworddoesn't means atomic, its common misconception that after declaring volatile ++ will be atomic, to make the operation atomic you still need to ensure exclusive access using synchronized method or block in Java.
- If a variable is not shared between multiple threadsno need to use volatilekeyword with that variable.
- Volatile keyword in Java is a field modifier, while synchronized modifies code blocks and methods.
- Synchronized obtains and releases lock on monitor’s Java volatile keyword doesn't require that.
- Threads in Java can be blocked for waiting any monitor in case of synchronized, that is not the case with volatile keyword in Java.
- Synchronized method affects performance more than volatile keyword in Java.
- Since volatile keyword in Java only synchronizes the value of one variable between Thread memory and"main"memory while synchronized synchronizes the value of all variable between thread memory and "main" memory and locks and releases a monitor to boot. Due to this reason synchronized keyword in Java is likely to have more overhead than volatile.
- You can not synchronize on null object but your volatile variable in java could be null.
- From Java 5 Writing into a volatile field has the same memory effect as a monitor release, and reading from a volatile field has the same memory effect as a monitor acquire
[待翻译]Apache Mesos and Jenkins – elastic build slaves | CloudBees
The Mesos project is a cluster management tool for building your own elastic clouds. (see more at mesosphere.io). Here I will take you through setting up Jenkins to make use of Mesos as an elastic cloud of build slaves. Mesos is fast changing project and one to watch.来源: Apache Mesos and Jenkins - elastic build slaves | CloudBees
解决MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk
java 7 创建文件并分配读写权限
Maven : NoClassDefFoundError Xms256m
anthelion使用Ant工具编译运行失败
如何查找MySQL中查询慢的SQL语句
使用方法,在select语句前加上explain就可以了:
例如:
explain select surname,first_name form a,b where a.id=b.id
结果如图
EXPLAIN列的解释
table 显示这一行的数据是关于哪张表的 type 这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL possible_keys 显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句 key 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句 中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引 key_len 使用的索引的长度。在不损失精确性的情况下,长度越短越好 ref 显示索引的哪一列被使用了,如果可能的话,是一个常数 rows MYSQL认为必须检查的用来返回请求数据的行数 Extra 关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢 extra列返回的描述的意义 Distinct 一旦MYSQL找到了与行相联合匹配的行,就不再搜索了 Not exists MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了 Range checked for each Record(index map:#) 没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一 Using filesort 看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行 Using index 列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候 Using temporary 看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上 Where used 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序) const 表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待 eq_ref 在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用 ref 这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好 range 这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况 index 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据) ALL 这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免MySQL - 查看慢SQL
查看MySQL是否启用了查看慢SQL的日志文件 (1) 查看慢SQL日志是否启用 mysql> show variables like 'log_slow_queries'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | log_slow_queries | ON | +------------------+-------+ 1 row in set (0.00 sec) (2) 查看执行慢于多少秒的SQL会记录到日志文件中 mysql> show variables like 'long_query_time'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | long_query_time | 1 | +-----------------+-------+ 1 row in set (0.00 sec) 这里value=1, 表示1秒 2. 配置my.ini文件(inux下文件名为my.cnf), 查找到[mysqld]区段,增加日志的配置,如下示例: [mysqld] log="C:/temp/mysql.log" log_slow_queries="C:/temp/mysql_slow.log" long_query_time=1 log指示日志文件存放目录; log_slow_queries指示记录执行时间长的sql日志目录; long_query_time指示多长时间算是执行时间长,单位s。 Linux下这些配置项应该已经存在,只是被注释掉了,可以去掉注释。但直接添加配置项也OK啦。 查询到效率低的 SQL 语句 后,可以通过 EXPLAIN 或者 DESC 命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序,比如我们想计算 2006 年所有公司的销售额,需要关联 sales 表和 company 表,并且对 profit 字段做求和( sum )操作,相应 SQL 的执行计划如下: mysql> explain select sum(profit) from sales a,company b where a.company_id = b.id and a.year = 2006\G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: a type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 12 Extra: Using where *************************** 2. row *************************** id: 1 select_type: SIMPLE table: b type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 12 Extra: Using where 2 rows in set (0.00 sec) 每个列的解释如下: •select_type :表示 SELECT 的 类型,常见的取值有 SIMPLE (简单表,即不使用表连接或者子查询)、 PRIMARY (主查询,即外层的查询)、 UNION ( UNION 中的第二个或者后面的查询语句)、 SUBQUERY (子查询中的第一个 SELECT )等。 •table :输出结果集的表。 •type :表示表的连接类型,性能由好到差的连接类型为 system (表中仅有一行,即常量表)、 const (单表中最多有一个匹配行,例如 primary key 或者 unique index )、 eq_ref (对于前面的每一行,在此表中只查询一条记录,简单来说,就是多表连接中使用 primary key 或者 unique index )、 ref (与 eq_ref 类似,区别在于不是使用 primary key 或者 unique index ,而是使用普通的索引)、 ref_or_null ( 与 ref 类似,区别在于条件中包含对 NULL 的查询 ) 、 index_merge ( 索引合并优化 ) 、 unique_subquery ( in 的后面是一个查询主键字段的子查询)、 index_subquery ( 与 unique_subquery 类似,区别在于 in 的后面是查询非唯一索引字段的子查询)、 range (单表中的范围查询)、 index (对于前面的每一行,都通过查询索引来得到数据)、 all (对于前面的每一行,都通过全表扫描来得到数据)。 •possible_keys :表示查询时,可能使用的索引。 •key :表示实际使用的索引。 •key_len :索引字段的长度。 •rows :扫描行的数量。 •Extra :执行情况的说明和描述。 在上面的例子中,已经可以确认是 对 a 表的全表扫描导致效率的不理想,那么 对 a 表的 year 字段创建索引,具体如下: mysql> create index idx_sales_year on sales(year); Query OK, 12 rows affected (0.01 sec) Records: 12 Duplicates: 0 Warnings: 0 创建索引后,这条语句的执行计划如下: mysql> explain select sum(profit) from sales a,company b where a.company_id = b.id and a.year = 2006\G; *************************** 1. row *************************** id: 1 select_type: SIMPLE table: a type: ref possible_keys: idx_sales_year key: idx_sales_year key_len: 4 ref: const rows: 3 Extra: *************************** 2. row *************************** id: 1 select_type: SIMPLE table: b type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 12 Extra: Using where 2 rows in set (0.00 sec) 可以发现建立索引后对 a 表需要扫描的行数明显减少(从全表扫描减少到 3 行),可见索引的使用可以大大提高数据库的访问速度,尤其在表很庞大的时候这种优势更为明显,使用索引优化 sql 是优化问题 sql 的一种常用基本方法,在后面的章节中我们会具体介绍如何使索引来优化 sql 。 本文主要介绍的是MySQL慢查询分析方法,前一段日子,我曾经设置了一次记录在MySQL数据库中对慢于1秒钟的SQL语句进行查询。想起来有几个十分设置的方法,有几个参数的名称死活回忆不起来了,于是重新整理一下,自己做个笔记。 对于排查问题找出性能瓶颈来说,最容易发现并解决的问题就是MySQL慢查询以及没有得用索引的查询。 OK,开始找出MySQL中执行起来不“爽”的SQL语句吧。 MySQL慢查询分析方法一: 这个方法我正在用,呵呵,比较喜欢这种即时性的。 MySQL5.0以上的版本可以支持将执行比较慢的SQL语句记录下来。 MySQL> show variables like 'long%'; 注:这个long_query_time是用来定义慢于多少秒的才算“慢查询” +-----------------+-----------+ | Variable_name | Value | +-----------------+-----------+ | long_query_time | 10.000000 | +-----------------+-----------+ 1 row in set (0.00 sec) MySQL> set long_query_time=1; 注: 我设置了1, 也就是执行时间超过1秒的都算慢查询。 Query OK, 0 rows affected (0.00 sec) MySQL> show variables like 'slow%'; +---------------------+---------------+ | Variable_name | Value | +---------------------+---------------+ | slow_launch_time | 2 | | slow_query_log | ON | 注:是否打开日志记录 | slow_query_log_file | /tmp/slow.log | 注: 设置到什么位置 +---------------------+---------------+ 3 rows in set (0.00 sec) MySQL> set global slow_query_log='ON' 注:打开日志记录 一旦slow_query_log变量被设置为ON,MySQL会立即开始记录。 /etc/my.cnf 里面可以设置上面MySQL全局变量的初始值。 long_query_time=1 slow_query_log_file=/tmp/slow.log MySQL慢查询分析方法二: MySQLdumpslow命令 /path/MySQLdumpslow -s c -t 10 /tmp/slow-log 这会输出记录次数最多的10条SQL语句,其中: -s, 是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙; -t, 是top n的意思,即为返回前面多少条的数据; -g, 后边可以写一个正则匹配模式,大小写不敏感的; 比如 /path/MySQLdumpslow -s r -t 10 /tmp/slow-log 得到返回记录集最多的10个查询。 /path/MySQLdumpslow -s t -t 10 -g “left join” /tmp/slow-log 得到按照时间排序的前10条里面含有左连接的查询语句。 简单点的方法: 打开 my.ini ,找到 [mysqld] 在其下面添加 long_query_time = 2 log-slow-queries = D:/mysql/logs/slow.log #设置把日志写在那里,可以为空,系统会给一个缺省的文件 #log-slow-queries = /var/youpath/slow.log linux下host_name-slow.log log-queries-not-using-indexes long_query_time 是指执行超过多长时间(单位是秒)的sql会被记录下来,这里设置的是2秒。 以下是mysqldumpslow常用参数说明,详细的可应用mysqldumpslow -help查询。 -s,是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序(从大到小),ac、at、al、ar表示相应的倒叙。 -t,是top n的意思,即为返回前面多少条数据。 www.2cto.com -g,后边可以写一个正则匹配模式,大小写不敏感。 接下来就是用mysql自带的慢查询工具mysqldumpslow分析了(mysql的bin目录下 ),我这里的日志文件名字是host-slow.log。 列出记录次数最多的10个sql语句 mysqldumpslow -s c -t 10 host-slow.log 列出返回记录集最多的10个sql语句 mysqldumpslow -s r -t 10 host-slow.log 按照时间返回前10条里面含有左连接的sql语句 mysqldumpslow -s t -t 10 -g "left join" host-slow.log 使用mysqldumpslow命令可以非常明确的得到各种我们需要的查询语句,对MySQL查询语句的监控、分析、优化起到非常大的帮助 在日常开发当中,经常会遇到页面打开速度极慢的情况,通过排除,确定了,是数据库的影响,为了迅速查找具体的SQL,可以通过Mysql的日志记录方法。 -- 打开sql执行记录功能 set global log_output='TABLE'; -- 输出到表 set global log=ON; -- 打开所有命令执行记录功能general_log, 所有语句: 成功和未成功的. set global log_slow_queries=ON; -- 打开慢查询sql记录slow_log, 执行成功的: 慢查询语句和未使用索引的语句 set global long_query_time=0.1; -- 慢查询时间限制(秒) set global log_queries_not_using_indexes=ON; -- 记录未使用索引的sql语句 -- 查询sql执行记录 select * from mysql.slow_log order by 1; -- 执行成功的:慢查询语句,和未使用索引的语句 select * from mysql.general_log order by 1; -- 所有语句: 成功和未成功的. -- 关闭sql执行记录 set global log=OFF; set global log_slow_queries=OFF; -- long_query_time参数说明 -- v4.0, 4.1, 5.0, v5.1 到 5.1.20(包括):不支持毫秒级别的慢查询分析(支持精度为1-10秒); -- 5.1.21及以后版本 :支持毫秒级别的慢查询分析, 如0.1; -- 6.0 到 6.0.3: 不支持毫秒级别的慢查询分析(支持精度为1-10秒); -- 6.0.4及以后:支持毫秒级别的慢查询分析; 通过日志中记录的Sql,迅速定位到具体的文件,优化sql看一下,是否速度提升了呢? 本文针对MySQL数据库服务器查询逐渐变慢的问题, 进行分析,并提出相应的解决办法,具体的分析解决办法如下:会经常发现开发人员查一下没用索引的语句或者没有limit n的语句,这些没语句会对数据库造成很大的影... 本文针对MySQL数据库服务器查询逐渐变慢的问题, 进行分析,并提出相应的解决办法,具体的分析解决办法如下: 会经常发现开发人员查一下没用索引的语句或者没有limit n的语句,这些没语句会对数据库造成很大的影响,例如一个几千万条记录的大表要全部扫描,或者是不停的做filesort,对数据库和服务器造成io影响等。这是镜像库上面的情况。 而到了线上库,除了出现没有索引的语句,没有用limit的语句,还多了一个情况,mysql连接数过多的问题。说到这里,先来看看以前我们的监控做法 1. 部署zabbix等开源分布式监控系统,获取每天的数据库的io,cpu,连接数 2. 部署每周性能统计,包含数据增加量,iostat,vmstat,datasize的情况 3. Mysql slowlog收集,列出top 10 以前以为做了这些监控已经是很完美了,现在部署了mysql节点进程监控之后,才发现很多弊端 第一种做法的弊端: zabbix太庞大,而且不是在mysql内部做的监控,很多数据不是非常准备,现在一般都是用来查阅历史的数据情况 第二种做法的弊端:因为是每周只跑一次,很多情况没法发现和报警 第三种做法的弊端: 当节点的slowlog非常多的时候,top10就变得没意义了,而且很多时候会给出那些是一定要跑的定期任务语句给你。。参考的价值不大 那么我们怎么来解决和查询这些问题呢 对于排查问题找出性能瓶颈来说,最容易发现并解决的问题就是MYSQL的慢查询以及没有得用索引的查询。 OK,开始找出mysql中执行起来不“爽”的SQL语句吧。 方法一: 这个方法我正在用,呵呵,比较喜欢这种即时性的。01 | Mysql5.0以上的版本可以支持将执行比较慢的SQL语句记录下来。 |
02 | mysql> show variables like 'long%'; 注:这个long_query_time是用来定义慢于多少秒的才算“慢查询” |
03 | +-----------------+-----------+ |
04 | | Variable_name | Value | |
05 | +-----------------+-----------+ |
06 | | long_query_time | 10.000000 | |
07 | +-----------------+-----------+ |
08 | 1 row in set (0.00 sec) |
09 | mysql> set long_query_time=1; 注: 我设置了1, 也就是执行时间超过1秒的都算慢查询。 |
10 | Query OK, 0 rows affected (0.00 sec) |
11 | mysql> show variables like 'slow%'; |
12 | +---------------------+---------------+ |
13 | | Variable_name | Value | |
14 | +---------------------+---------------+ |
15 | | slow_launch_time | 2 | |
16 | | slow_query_log | ON | 注:是否打开日志记录 |
17 | | slow_query_log_file | /tmp/slow.log | 注: 设置到什么位置 |
18 | +---------------------+---------------+ |
19 | 3 rows in set (0.00 sec) |
20 | mysql> set global slow_query_log='ON' 注:打开日志记录 |
21 | 一旦slow_query_log变量被设置为ON,mysql会立即开始记录。 |
22 | /etc/my.cnf 里面可以设置上面MYSQL全局变量的初始值。 |
23 | long_query_time=1 |
24 | slow_query_log_file=/tmp/slow.log |
01 | /path/mysqldumpslow -s c -t 10 /tmp/slow-log |
02 | 这会输出记录次数最多的10条SQL语句,其中: |
03 | -s, 是表示按照何种方式排序,c、t、l、r分别是按照记录次数、时间、查询时间、返回的记录数来排序,ac、at、al、ar,表示相应的倒叙; |
04 | -t, 是top n的意思,即为返回前面多少条的数据; |
05 | -g, 后边可以写一个正则匹配模式,大小写不敏感的; |
06 | 比如 |
07 | /path/mysqldumpslow -s r -t 10 /tmp/slow-log |
08 | 得到返回记录集最多的10个查询。 |
09 | /path/mysqldumpslow -s t -t 10 -g “left join” /tmp/slow-log |
10 | 得到按照时间排序的前10条里面含有左连接的查询语句。 |