|
|
MySQL学习
MySQL优化
MySQL缓存
配置文件/etc/my.cnf
|
|
重启mysql后就会启动mysql的缓存机制Query Cache。
在使用中,查询缓存会存储一个SELECT
查询的文本与被传送到客户端的相应结果。
如果之后接收到一个同样的查询,服务器将从查询缓存中检索结果,而不是再次分析和执行这个同样的查询。
注意:查询缓存绝不返回过期数据。当数据被修改后,在查询缓存中的任何相关词条均被转储清除。
适用于更改不是太频繁的表且有大量相同查询的情况
执行计划explain
mysql的执行计划explain语句,显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 explain是mysql常用性能分析语句,使用方法是在select语句前加上explain就可以了,例如:
explain select surname,first_name form. a,b where a.id=b.id
EXPLAIN结果返回解释:
- id:是一组数字,表示查询中执行select子句或操作表的顺序。如果id相同,则执行顺序从上至下。如果是子查询,id的序号会递增,id越大则优先级越高,越先会被执行。id如果相同,则可以认为是一组,从上往下顺序执行,所有组中,id越高,优先级越高,越容易执行。
- selecttype:有simple,primary,subquery,derived(衍生),union,unionresult。
- simple:表示查询中不包含子查询或者union。
- primary: 当查询中包含任何复杂的子部分,最外层的查询被标记成primary
- subquery:在select或where列表中包含了子查询,则子查询被标记成subquery
- derived:在from的列表中包含的子查询被标记成derived。
- union:若第二个select出现在union后,则被标记成union,若union在from子句的子查询中,外层的select被标记成derived。
- union result:从union表获取结果的select被标记成union result。
- table:显示这一行的数据是关于哪张表的
- type:type叫访问类型,表示在表中找到所需行的方式(显示连接使用了何种类型)。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL
- ALL,即full table scan,mysql将遍历全表来找到所需要的行。
- index为full index scan,只遍历索引树。
- range表示索引范围扫描 ,对索引的扫描开始于一点,返回匹配的值域的行,常见于between,<,>的查询。
- ref为非唯一性索引扫描,返回匹配某个单独值的所有行,常见于非唯一索引即唯一索引的非唯一前缀进行的查找。
- eq_ref表示唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或者唯一索引扫描。
- const,system表示当对查询部分进行优化,并转化成一个常量时,使用这些类型访问。比如将主键置于where列表中,mysql就能把该查询置成一个常量。system是const的一个特例,当查询表中只有一行的情况下使用的是system。
- NULL表示在执行语句中,不用查表或索引。
- 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,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)
- system 表只有一行:system表。这是const连接类型的特殊情况
- const:表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待
- eq_ref:在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用
- ref:这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好
- range:这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况
- index: 这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)
- ALL:这个连接类型对于前面的每
mysq的执行计划有一定局限性,如下:
- EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
- EXPLAIN不考虑各种Cache
- EXPLAIN不能显示MySQL在执行查询时所作的优化工作
- 部分统计信息是估算的,并非精确值
- EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划
MySQL索引说明
覆盖索引
MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件 包含所有满足查询需要的数据的索引称为 覆盖索引(Covering Index) 如果要使用覆盖索引,一定要注意select列表中只取出需要的列,不可select *,因为如果将所有字段一起做索引会导致索引文件过大,查询性能下降
参考
Nginx笔记
sever设置
autoindex: 打开目录浏览功能
nginx中可以在server或location 段里添加上autoindex on;来列出整个目录, 比如在server段添加:
|
|
相关属性
autoindex_exact_size
autoindex_exact_size off
;
默认为on,显示出文件的确切大小,单位是bytes。
改为off后,显示出文件的大概大小,单位是kB或者MB或者GB
autoindex_localtime
默认为off,显示的文件时间为GMT时间。
改为on后,显示的文件时间为文件的服务器时间
Linux Shell脚本攻略
这里是本人学习linux中整理的一些笔记归档,写的比较粗略,可做为linux常用一些目录的快速入门教程。但如果像具体点学习一个命令的所有应用,这里可能不太适合你,当然,后面又参考部分你可以进入看看详细的一些教程。enjoy it!
前言:shell基础说明
shell的使用
shell脚本规范:
一个shell脚本的执行方法:
|
|
一、shell系统基础
1.1 环境变量和变量
bash中,每个变量的值都是字符串,无论你给变量赋值时是否使用引号,值都会以字符串的形式存储
环境变量
查看所有与此终端进程相关的环境变量: env
查看某个进程的环境变量: cat /proc/$PID/environ
变量赋值:
|
|
环境变量
未在当前进程中定义,而是从父进程中继承而来的变量, export 设置环境变量之后,从当前shell 执行的任何程序都会继承这个变量, 如:
export PYTHONPATH=$PYTHONPATH:/home/ken/workspace
我们linux中常用的环境变量如:
|
|
识别当前shell版本:
echo $SHELL
echo $0
1.2 命令状态
当命令成功完成, 返回0
发生错误并退回, 返回非0
可以从$?中获取 cmd; echo $?
文件描述符和重定向
文件描述符: 与文件输入/输出相关联的整数, 用来跟踪已打开的文件
|
|
重定向到文件:
输出分离或合并:
扔到垃圾桶:
同时输出到终端和文件:
将stdin作为命令参数: cmd1 | cmd2 | cmd3 -
将文件重定向到命令: cmd < file
自定义文件描述符:
二、字符串处理
2.1 sed简明教程
2.2 awk简明教程
2.3 输出和打印(echo & printf)
echo
基于标准输出打印一段文本
- 忽略结尾换行符:
echo -n 'test\n'
- 对字符串进行转义:
echo -e '1\t2\t3'
- 打印彩色输出:12345678910111213141516171819202122232425文字颜色码重置0黑色30红色31绿色32黄色33蓝色34洋红35青色36白色37echo -e "\e[1;31m This is red test \e[0m"背景颜色码重置0黑色40红色41绿色42黄色43蓝色44洋红45青色46白色47echo -e "\e[1;42m Green Background \e[0m"
printf
可以格式化字符串, 使用参数同c中printf一样
|
|
三、 进程管理
3.1 pgrep
获取某个进程名对应进程id 使用命令pgrep
, 例如:pgrep php
四、 运算
4.1 shell数学运算
let
expr
echo \
expr 1 + 7``result=$(expr $no1 + 5)
其他运算
|
|
浮点数: bc
|
|
五、数组:数组和关联数组
- 普通数组,整数作为数组索引, 借助索引将多个独立的数据存储为一个集合(list)
- 关联数组,可以使用字符串作为索引(map)
注意,在mac中的shell不能使用索引该笔记的关联数组
。
5.1 普通数组
|
|
5.2 关联数组
|
|
工具参考
crontab
crontab文件的含义:
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
其中:
- minute: 表示分钟,可以是从0到59之间的任何整数。
- hour:表示小时,可以是从0到23之间的任何整数。
- day:表示日期,可以是从1到31之间的任何整数。
- month:表示月份,可以是从1到12之间的任何整数。
- week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
- command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
- 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
参考
PHP内存优化
在php中,我们最常用 memory_get_usage()
来返回php内存的使用情况,它默认单位是Bytes,
一、内存溢出问题
内存溢出解决方案
这里,不难看出,一方面,我们要增加PHP可用内存大小,另一方面,只要我们想办法对数组进行分批处理,分而治之,将用过的变量及时销毁(unset),一般是不会出现溢出问题的。
另外,为了节省PHP程序内存损耗,我们应当尽可能减少静态变量的使用,在需要数据重用时,可以考虑使用引用(&)。再一点就是:数据库操作完成后,要马上关闭连接;一个对象使用完,要及时调用析构函数(__destruct())。
结论
- php5.3及以上可以使用函数
gc_collect_cycles()
进行垃圾回收 - 使用完变量需要用
unset()
销毁
参考的一些文章:
Java笔记1
这个笔记是基于《Java语言程序设计(一)》
主要内容有:
- Java语言基础
- 运算和语句
- 面向对象编程基础
- 数组和字符串
- 图形界面设计
- 图形、图像与多媒体
- 多线程
- 输入和输出流
- 伟林与数据库编程基础
一、Java语言基础
1.1
2016-12-19 本周新书:MySQL技术内幕 - SQL编程
本周读书任务:《MySQL技术内幕 - SQL编程》
限定阅读时间:2016-12-19~2016-12-25
PHP设计模式(1) - 开始
一、基础环境准备
- IDE选择: PHPstorm
- 字体选择:等宽的字体
二、一些必备的php基础
2.1 命名空间
- php 5.3+
2.2 类自动载入
__autoload()
spl_autoload_register(方法)
2.3 PSR-0,PSR-4规范
symfony框架学习
要学习一些现代php必须用symfony或者laraval, 这些默认都要php5.5+以上版本. 此系统使用homebrew安装的php5.6环境进行开发, 下面是学习Symfony 3.2.4的一些笔记.
一, 安装
|
|
二, 框架结构
PHP代码标准和测试(未完待续)
用于检测php代码标准的套件有:
- phpcs
- phpmd
- phpcbf
- php-cs-fixer
下面将简单介绍这些工具的安装和使用方法
一, 安装
使用composer安装(推荐)
然后,确保~/.composer/vendor/bin目录在你的PATH中。
export PATH=”$PATH:$HOME/.composer/vendor/bin”
|
|
检查是否都成功安装:
二, 使用
2.1 phpcs
- 查看帮助:phpcs –help
- 添加标准:phpcs –config-set installed_paths PATH_TO_SEARCH_STANDARDS
注意:假设标准为 Weibo, 目录为:
/Users/overtrue/code_standards/Weibo
其中Weibo 里才是 ruleset.xml,那么对应上面的 PATH_TO_SEARCH_STANDARDS 应该为:
phpcs –config-set installed_paths /Users/overtrue/code_standards
开发中我们经常使用wordpress的标准来, 设置如下:
|
|
- 查看已经安装的标准:phpcs -i
- 查看配置:phpcs –config-show
- 检查代码规范:
phpcs ./codes/Example.php
// or
phpcs ./codes/
- 指定标准:phpcs ./codes/Example.php –standard=PSR2
- 报告格式:phpcs –report=summary /path/to/code
可用的格式有(默认为: full):
full, xml, checkstyle, csv
json, emacs, source, summary, diff
svnblame, gitblame, hgblame or notifysend
修复代码
第一种:使用 diff 形式打补丁:
phpcs –report-diff=/path/to/changes.diff /path/to/code
patch -p0 -ui /path/to/changes.diffpatching file /path/to/code/file.php
第二种:使用 PHP Code Beautifier 和 Fixer:
phpcbf /path/to/code
以上命令会自动修复原文件,如果不想直接覆盖原文件,可以使用 –suffix 指定修复后的代码后缀:
phpcs /path/to/code –suffix=.fixed
更多 PHPCS 的使用请参考:https://github.com/squizlabs/PHP_CodeSniffer/wiki
2.2 phpmd使用
使用phpmd检查代码质量操作如:
|
|
报告格式有:
- xml, 以 XML 格式输出;
- text, 简单的文本格式;
- html, 输出到单个的html;
这里有一个phpmd规则可参考:https://github.com/overtrue/phpmd-rulesets
更多关于 PHPMD 的使用请参考:http://phpmd.org/documentation/index.html
2.3 php-cs-fixer
参考