给你一台服务器让你去优化,第一,先要去观察问题,只有观察到了问题,才能知道如何去优化。
先做基准测试,看看我们的服务器潜力到底有多大。
1.打开Mysql服务
2.查看我们Mysql的版本和安装了哪些相关的东西
3.登录Mysql
4.执行show status;
5.返回200多行数据,着重关注这3行
当前已经发生了多少次查询
有几个线程过来连接了(有多少个连接)
有几个进程正在工作(连接中有多少个是活动的)
AWK:按行读取文件,把当前行赋给变量$0,把当前行的第一列赋给$1,第二行赋给$2,以此类推。
下面这几条命令执行的就是
- 把score.txt中的内容原样打印出来。
- 把每一行的第一列的值打印出来
- 把每一行的第二列的值打印出来
AWK还可以使用正则匹配。如下这条命令,就是把l开头的行,打印出来。
show status;命令,也可以用mysqladmin -uroot ext替换。
所以如下这条命令就是,把mysqladmin –uroot ext命令的结果,传给awk,然后把Queries开头的行的第四列的值打印出来
如下的命令是,把Queries,Threads_Connected,Threads_running开头的行的第四列的值打印出来。
在AWK中,我们还可以设置变量,下面的名师是,把Queries,Threads_Connected,Threads_running开头的行的第四列的值分别赋给变量q,c,r,然后再通过变量,把这些值打印出来,得到的结果是一样的。
AWK的执行过程是会,把正则匹配及处理方式带入到每一行。循环过程中的每一行,先通过正则对这一行进行匹配,如果匹配成功,则用处理方式进行处理,否则,跳过。就像上述命令,就是正则先匹配Queries,Threads_Connected,Threads_running,匹配成功之后,用处理方式进行处理,处理方式就是打印,也就是printf函数
试验
1.启动memcached,给他512M内存
2.启动Nginx
3.由于我们的nginx是fastcgi的方式,所以需要把php也起来
表的优化与列类型选择
列选取原则
- 字段类型优先级,整型>data,time>enum>char,varchar>blob
原因:整型,time运算块,节省空间
char varchar要考虑字符集的转换与排序时的校对集,速度慢
Blob无法使用内存临时表
- 够用就行,不要慷慨(如smallint,varchar(N))
原因:大的字段浪费内存,影响速度
以varchar(10),varchar(300)存储的内容相同,但是在表联查时,varchar(300)需要花更多的内存
- 进来避免用NULL
原因:NULL不利于索引,要用特殊的字符来标注
在磁盘上占据的空间其实更大
试验
可以建立2张字段相同的表,一个允许为null,一个不允许为null,各加入1W条数据,查看索引文件的大小。可以发现null的索引要大些
Enum类说明
- enum列在内部用整型来存储
- enum列月enum列想关联速度最快(意思是如果一张表的字段使用了enum,那么另外一张表也尽量使用enum)
- enum列比char,varchar的弱势—---在碰到与char关联时,要转化,要花时间
- 有时在于,当char非常长时,enum依然是整型固定长度。当查询的数据量越大时,enum的有时越明显
- enum与char,varchar关联,因为要转化,速度要比enum->enum,char->char要慢,但有时候也这样用----就是在暑假了特别大时,可以节省IO