Press "Enter" to skip to content

Month: August 2017

MySQL性能优化

性能优化是通过某些有效的方法提高MySQL数据库的性能。性能优化的目的是为了使MySQL数据库运行速度更快、占用的磁盘空间更小。主要包括优化查询速度、优化更新速度和优化MySQL服务器等。

数据库管理员可以使用'show status like 'value';'来查看数据库的性能:

mysql> show status like 'Connections';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Connections   | 6     |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show status like 'uptime';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Uptime        | 19052 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show status like 'com_select';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_select    | 71    |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show status like 'com_insert';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Com_insert    | 1     |
+---------------+-------+
1 row in set (0.01 sec)

优化查询

通过对查询语句的分析,可以了解查询语句的执行情况。MySQL中,可使用explain和edscribe来分析语句。

mysql> explain select * from employee\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: employee
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 7
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)
mysql> create index index_name on employee(name);
Query OK, 0 rows affected (0.02 sec)
mysql> explain select name from employee where name='tom'\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: employee
   partitions: NULL
         type: ref
possible_keys: index_name
          key: index_name
      key_len: 62
          ref: const
         rows: 1
     filtered: 100.00
        Extra: Using index
1 row in set, 1 warning (0.00 sec)

使用索引查询时,一定要注意索引的使用情况。例如,like关键字配置的字符创不能以’%‘开头;使用多列索引时,查询条件必须要使用这个索引的第一个字段;使用or关键字时,or关键字所链接的所有条件都必须使用索引。

优化数据库结构

  1. 将字段分解为多个表;
  2. 增加中间表;
  3. 增加冗余字段;
  4. 优化插入记录的速度;
  5. 分析表、检查表和优化表

优化服务器

  1. 优化服务器硬件;
  2. 优化MySQL的参数。

存储过程与函数

存储过程和函数实在数据库中年定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句。存储过程和函数可以避免开发人员重复的编写相同的SQL语句。而且,存储过程和函数实在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输。

创建存储过程和函数

创建存储过程和函数是指将经常使用的一组SQL语句组合在一起,并将这些SQL语句当做一个整体存储在MySQL服务器中。

创建示例表

idnamecompanypriceproduce_timevalidity_timeaddress
1AA饼干AA饼干厂2.520083北京
2CC牛奶CC牛奶厂3.520091河北
3EE果冻EE果冻厂1.520072北京
4FF咖啡FF咖啡厂2020025天津
5GG奶糖GG奶糖厂1420033广东
#创建表
mysql> create table food
(id int(10) not null unique primary key auto_increment,
name varchar(20) not null, 
company varchar(30) not null, 
price float, 
produce_time YEAR, 
validity_time int(4), 
address varchar(50)) 
default charset=utf8;
#插入数据
mysql> insert into food values
(1,'AA饼干','AA饼干厂',2.5,'2008',3,'北京'),
(2,'CC牛奶','CC牛奶厂',3.5,'2009',1,'河北'),  
(3,'EE果冻','EE果冻厂',1.5,'2007',2,'北京'),  
(4,'FF咖啡','FF咖啡厂',20,'2002',5,'天津'),  
(5,'GG奶糖','GG奶糖厂',14,'2003',3,'广东');
#创建存储过程
mysql> delimiter &&
mysql> create procedure food_price_count(in price_info1 float,in price_info2 float,out  count int)
    -> reads sql data
    -> begin
     -> declare temp float;
    -> declare match_price cursor for select price from food;
    -> declare exit handler for not found close match_price;
    -> set @sum=0;
    -> select count(*) into count from food
    -> where price>price_info1 and price_info2;
    -> open match_price;
    -> repeat
    -> fetch match_price into temp;
    -> if temp>price_info1 and price_info2
    -> then set @sum=@sum+temp;
    -> end if;
    -> until 0 end repeat;
    -> close match_price;
    -> end&&
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> call food_price_count(2,18,@count);
Query OK, 0 rows affected (0.00 sec)
mysql> select @count,@sum;
+--------+------+
| @count | @sum |
+--------+------+
|      4 |   40 |
+--------+------+
1 row in set (0.00 sec)
#查看存储过程状态
mysql> show create procedure food_price_count\G
#删除存储过程
mysql> drop procedure food_price_count;

CentOS虚拟化实验环境搭建

为了准备RHCE考试,我把一台i7-2600k、16G内存、120Gssd的闲置主机刷成了CentOS7.下面是具体环境搭建的细节。


首先是系统的准备工作

su

yum update -y
yum install -y epel-release
yum makecache

yum install -y bash-completion network-tool sysfsutils 
yum install -y htop vim ctags curl wget mlocate lftp
curl https://raw.githubusercontent.com/wklken/vim-for-server/master/vimrc > ~/.vimrc

配置虚拟化环境

#安装kvm
yum -y install qemu-kvm libvirt virt-install bridge-utils
yum -y install libguestfs-tools virt-top

#启动虚拟化管理服务
systemctl start libvirtd
systemctl enable libvirtd

#开启kvm嵌套
echo "options kvm-intel nested=1" >> /etc/modprobe.d/kvm-intel.conf

#重新加载kvm模块
modprobe -r kvm_intel
modprobe kvm_intel

#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

#关闭selinux
vi /etc/selinux/config 
>SELINUX=disabled

reboot

Ubuntu下网络部署CentOS

首先安装DHCP服务

sudo apt install vsftp isc-dhcp-server pxelinux tftpd-hpa

增加DHCP服务指定网卡

sudo vi /etc/default/isc-dhcp-server 
interface="enp0s25"

添加DHCP作用域

sudo vi /etc/dhcp/dhcpd.conf
 subnet 172.16.66.0 netmask 255.255.255.0{
     range 172.16.66.10 172.16.66.100;
     option subnet-mask 255.255.255.0;
     option routers 172.16.66.6;
     option broadcast-address 172.16.66.255;
     filename "pxelinux.0";                                                  
     next-Server 172.16.66.6;
 } 

启动DHCP服务

sudo service isc-dhcp-server start
sudo systemctl status isc-dhcp-server

配置tftp服务

sudo vi /etc/default/tftpd-hpa
#在文件行末添加
RUN_DAEMON="yes"
OPTIONS="-l -s /var/lib/tftpboot" 
#然后启动tftp服务
sudo service tftpd-hpa start
sudo systemctl status tftpd-hpa

复制安装文件

cd /var/lib/tftpboot/
sudo mkdir ubuntu centos pxelinux.cfg
cd /usr/lib/syslinux/modules/bios/
sudo cp vesamenu.c32 ldlinux.c32 libutil.c32 /var/lib/tftpboot
cd -
sudo cp /usr/lib/PXELINUX/pxelinux.0 ./

将相应iso解压至/srv/ftp/centos目录
将/srv/ftp/centos/images/pxeboot/目录复制到/var/lib/tftpboot/目录下。
编辑pxelinux.cfg/default文件

default vesamenu.c32
timeout 100
prompt localboot
noescape 1

menu title ##### PXE Deploy Menu #####

Label 1
    menu label ^1 Install CentOS 7.3
    kernel centos/vmlinuz
    initrd centos/initrd.img quiet
    append repo=ftp://172.16.66.6/centos devfs=nomount

Label 2                                                                    
     menu label ^2 Boot from LocalDrive
     localboot


Tips:
1. 需要注意的是centos7版本以前的需要使用method来制定安装源,现在要使用repo来指定,否则会报错。
2. 不需要安装inetutils-inetd和配置xinetd服务了,同时启动xinet和tftpd会出现占用IP Address的报错导致tftp无法启动。