Mysql的数据库的原理、安装、基本应用
第一部分:mysql的原理
mysql执行流程:
mysql是一个单进程的服务,对于每一个请求都是用线程来响应的,这就需要一个连接器来处理新用户的请求,响应,销毁。
 

1、客户端请求,服务器端(连接器)开辟线程响应用户
2、用户发起SQL语句查询数据库
3、查询缓存:记录用户的SQL查询语句,如果再次查询同样内容,就返回缓存
4、如果缓存没有进入分析器:(分析器也可能借签缓存)
语法分析器:用户命令语法是否正确
词法分析器:将用户的命令进行切片,一个词一个词用空格隔开,获得用户要查询的表,内容,用户的权限等
5、优化:执行路径的选择,生成执行树
每个SQL语句都有很多执行路径,优化的目的就是在这些执行路径里选择一个最优的执行路径
6、存储引擎:用于管理存储在文件系统,甚至是裸设备上的数据管理程序,它本身给上层应用提供不同的管理,有的支持事务,有的不支持事务。
数据库对象
逻辑对象:表,二维关系、索引、视图、触发器、存储过程、存储函数、事件調读器、游标、用户。
物理对象:数据管理组件(元数据)、存储引擎、 存储为物理文件。
数据库管理系统的基本功能:
    管理存储(maintaining storage)(存储引擎进行管理)
    安全管理(maintaining security)
    元数据管理(managing metadata)
    事务管理(managing transaction)
    ACID(原子性、一致性、隔离性、持久性)
    可以被看作一个整体的多个SQL语句 
    连接管理(supporting connectivity)    
    性能优化(optimizing performance)
    备份和还原机制(providing back-up and recovery mechanisms)
响应数据查询/修改请求(processing requests for data retrieval and modification)
存储引擎:将数据存储下来的中间层,
 MyISAMInnoDBNDBArcglveFederatedMemoryMerge:合并,多表合并成一个
rawdevice:裸设备,没有格式化
 主键:(primary key)
        非空(Not NULL)
        不能有相同值
        一个表只能有一个主键   
外键:(foreign key)
        表与表之间建立约束,不存在的不可建立约束
        外键约束又叫引用型约束
唯一性约束:(unique key)
        可以为空(NULL)
        若不为空,则值不能相同
        一个表可以有多个
日志文件:
 Redo(重做日志、Undo、Data、Index、Binary、Error、Query、Slow(慢查日志,重要)
数据存储格式:
Binary、ASCII
数据类型(data type):
整数型:
字符型:
  
日期时间型
字符型的特殊类型MySQL内置的类型):
    enum 枚举型,事先定义,最多定义65535个,但最多可以取一个
set 集合型,也需事先定义,最多定义64个,可取多个
第二部分:mysql的安装
安装方式:
1、    rpm包的直接安装
2、    源代码编译安装
3、    绿色软件(解压直接使用)
 我在这里给大家带来的是第二、源代码编译安装mysql。根据下面的步骤一步一步的操作。
1、准备数据存放的文件系统
 使用命令echo创建分区、记住一定要是逻辑分区8e。
[root@localhost ~]# partprobe /dev/sda            识别分区
[root@localhost ~]# pvcreate /dev/sda6       创建物理卷
[root@localhost ~]# vgcreate myvg /dev/sda5 创建卷组
[root@localhost ~]# lvcreate -L 2G -n mylv myvg 在创建逻辑卷
[root@localhost ~]# mke2fs -j /dev/myvg/mylv    格式化
[root@localhost ~]# mkdir /mydata              创建目录
[root@localhost ~]# vim /etc/fstab               编辑开机自动挂载文件
在文件中写下光标所在的那行:
[root@localhost ~]# mount /dev/myvg/mylv /mydata      挂载至
[root@localhost ~]# mkdir /mydata/data         在创建mydata子目录
 
2、新建用户以安全方式运行进程:
# groupadd -r mysql     创建用户组
# useradd -g mysql -r -s /sbin/nologin -M -d /mydata/data mysql   创建用户
# chown -R mysql:mysql /mydata/data    把/mydata/data 目录属主属组改为myqsl
 
3、安装并初始化mysql-5.5.19
 
首先下载平台对应的mysql版本至本地,我这里是32位平台,因此,我在这选择的为mysql-5.5.19-linux2.6-i686.tar.gz。具体下载就不给出步骤。
# tar xvf mysql-5.5.19-linux2.6-i686.tar.gz -C /usr/local   解压至/usr/local 目录
# cd /usr/local/   切换至目录
# ln -sv mysql-5.5.19-linux2.6-i686  mysql   创建软链接
# cd mysql  切换至目录
# chown -R mysql:mysql ./ 改属主属组 .
# scripts/mysql_install_db --user=mysql --datadir=/mydata/data   初始化mysql
# chown -R root ./ .     把属主改回root
[root@localhost mysql]# ./scripts/mysql_install_db –help       查看帮助信息
 
4、为mysql提供主配置文件:
 
[root@localhost mysql]# cd support-files/   切换至目录
[root@localhost support-files]# cp my-large.cnf /etc/my.cnf   复制并改名配置文件至/etc 下;
[root@localhost support-files]# vim /etc/my.cnf   打开配置文件
并修改此文件中thread_concurrency的值为你的CPU个数乘以2,另外还需要添加如下行指定mysql数据文件的存放位置;使用如下行:
 
5、为mysql提供sysv服务脚本:
 
# cd /usr/local/mysql                切换至目录
# cp support-files/mysql.server /etc/rc.d/init.d/mysqld     复制服务脚本并改名为mysqld至/etc/rc.d/init.d/mysqld 
 
添加至服务列表:
# chkconfig --add mysqld   加入服务
# chkconfig mysqld on     开启mysql
 
而后就可以启动服务测试使用了。
# service mysqld start
 
 
为了使用mysql的安装更全面,我下面的步骤将其开发组件导出给系统使用;
如下步骤:
 
6、输出mysqlman手册至man命令的查找路径:
 
编辑 vim /etc/man.config,添加如下行即可:
MANPATH /usr/local/mysql/man
 
7、输出mysql的头文件至系统头文件路径/usr/include
 
这可以通过简单的创建链接实现:
# ln -sv /usr/local/mysql/include /usr/include/mysql
 
 
8、输出mysql的库文件给系统库查找路径:
 
# echo '/usr/local/mysql/lib' > /etc/ld.so.conf.d/mysql.conf   
 
而后让系统重新载入系统库:
# ldconfig -v
 
 
9、修改PATH环境变量
让系统可以直接使用mysql的相关命令。
# vim /etc/profile
添加在定义环境变量PATH行上面
PATH=$PATH:/usr/local/mysql/bin:/usr/local/apache/bin

第三部分:mysql的基本应用
 
对管理员设置密码
第一种方式:
[root@localhost ~]# mysqladmin -uroot -hlocalhost -p password '12345'
执行这个命令后会显示
Enter password:
刚编译安装的mysql没有密码直接按确定键就ok啦!
 
第二种要进入mysql设置:
拿上面设置的密码来说吧;执行命令:
[root@localhost ~]# mysql -uroot -p
Enter password:      在这输入刚才设置的密码12345
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
mysql>                  进入mysql
设置密码:mysql> set password for root@localhost=password('wangchao');
显示成功:Query OK, 0 rows affected (0.00 sec)  
 
Mysql的使用:
首先进入mysql
[root@localhost ~]# mysql -uroot -p
Enter password:
mysql> show databases;     查看当前数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.01 sec)
mysql> use test;         把此表设为默认数据库
Database changed
mysql> show tables;    查看设为默认数据库有哪些表、这里此表为空;  
Empty set (0.00 sec)
mysql> create database jiaowu;   创建数据库;  
Query OK, 1 row affected (0.00 sec)
mysql> use jiaowu;                把教务设为默认数据库
Database changed
mysql> create table students (
    -> SID INT UNSIGNED AUTO_INCREMENT NOT NULL UNIQUE KEY,
    -> Name CHAR(100) NOT NULL,
    -> Age INT UNSIGNED,
    -> Gender ENUM('F','M') DEFAULT 'M',
    -> CID1 INT UNSIGNED,
    -> CID2 SMALLINT UNSIGNED,
    -> BirthDate DATETIME,
    -> ExtraInfo TINYTEXT );   创建表;                
Query OK, 0 rows affected (0.10 sec)
mysql> desc students;                  查看表的内容
+-----------+----------------------+------+-----+---------+----------------+
| Field     | Type                 | Null | Key | Default | Extra          |
+-----------+----------------------+------+-----+---------+----------------+
| SID       | int(10) unsigned     | NO   | PRI | NULL    | auto_increment |
| Name      | char(100)            | NO   |     | NULL    |                |
| Age       | int(10) unsigned     | YES |     | NULL    |                |
| Gender    | enum('F','M')        | YES |     | M       |                |
| CID1      | int(10) unsigned     | YES |     | NULL    |                |
| CID2      | smallint(5) unsigned | YES |     | NULL    |                |
| BirthDate | datetime             | YES |     | NULL    |                |
| ExtraInfo | tinytext             | YES |     | NULL    |                |
+-----------+----------------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
mysql> insert into students (Name,Age,Gender,CID1,CID2) values ('w','19','F',2,3); 
Query OK, 1 row affected (0.05 sec)
向表中插入数据
 
mysql> select * from students where age >=19;     在students表查询
+-----+------+------+--------+------+------+-----------+-----------+
| SID | Name | Age | Gender | CID1 | CID2 | BirthDate | ExtraInfo |
+-----+------+------+--------+------+------+-----------+-----------+
|   1 | w    |   19 | F      |    2 |    3 | NULL      | NULL      |
+-----+------+------+--------+------+------+-----------+-----------+
1 row in set (0.00 sec)
mysql> drop table students;                 删除表
Query OK, 0 rows affected (0.05 sec)