MySQL 基础之一
为了满足关系范式:通常一个大的数据集会拆成在一个库(集合内)中多张表表来存储,每一张表就是由行和列组成的二维关系,表与表之间也有关系,查询有时候需要做表链接,而表链接这个过程需要依赖于索引到各种算法来实现尽可能少的产生中间数据。
一、数据库层次关系
1、数据库系统 dbms: database managemnet system
2、数据库 database: 一个数据库系统中有多个数据库;
3、数据表 table: 多行多列的表格;一个数据库中有多个表;
4、字段 field: 一列数据;一个表有多个列;
5、行 row: 一行数据;一个表有多行;
6、数据 data: 具体数据;
![PHP之MySQL:基础-半竹博客](http://mdimg.95408.com/201901212319_366.png?imageView2/2/w/800/h/800)
3、大小写及命令细节
1、mysql不区分大小写;
2、如果是生成文件夹的命令,文件夹名称有大小写之分,不同系统对文件名称有大小写区分;
3、标识符:建议使用字母、数字、下划线,不以数字开关;
4、标识符与系统关键字冲突,最好使用反引号:``
;
5、数据库名、表名、视图名,建议小写,及下划线命名方式;
https://blog.51cto.com/sonlich/1970069
4、数据的组织结构 :层次型、网状型、关系型、
5、事务:多个操作被当作一个整体对待
A:原子性
C :一致性
I:隔离性
D:持久性
6、SQL:Structure Query Language
结构化查询语言
SQL解析器
数据存储协议:应用层协议 C/S架构
S :server 监听于套接字,接受并处理客户端的应用请求
C : 程序接口:GUI 、CLI
应用层编程接口 :ODBC Open DataBase Connection
二、基础概念
约束:constraint 向数据表提供的数据要遵守的限制
主键:一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行:必须提供数据 即NOT NULL;
唯一键 :一个或多个字段的组合,填入的数据必须能在本表中唯一标识本行:允许为NULL;
外键:一个表中的某个字段可填入数据取决于另一个表的主键已有的数据;
检查性:
索引:将表中的一个或多个字段中的数据复制一份另存,并且此需要按特定次序排序存储
关系运算:
选择:挑选出符合条件的行(部分)
投影:挑选出需要的字段(列)
数据抽象:
物理层:决定数据的存储格式,即RDBMS在磁盘上如何组织文件
表和文件并不是一一对应的,如何存储是在物理层决定
对磁盘而言,看到的内容使二进制数据流
逻辑层:描述DB存储什么数据,以及数据间存在什么样的关系
视图层:描述DB中的部分数据
对用户而言,看到内容是文件
关系模型的分类:
关系模型
实体-关系模型
基于对象的关系模型
半结构化的关系模型
安装MySQL :
源代码:编译安装 需cmake
https://blog.51cto.com/xiexiaojun/1679995
二进制格式的程序包:展开至特定路径,并经过简单配置后即可使用
https://blog.51cto.com/sonlich/1970069
https://blog.51cto.com/xiexiaojun/1660813
三、MariaDB,开源RDBMS的实现
特性
插件式存储引擎【表类型】:逻辑概念转换成磁盘格式【表--->文件】,提供逻辑概念的约束得以执行
存储引擎也称之为“表类型”
a)支持更多的存储引擎:
mysql标准的存储引擎:MyISAM【不支持事务】,InnoDB【事务,间隙锁】
MariaDB:Aria【myisam的升级版:崩溃后恢复】,InnoDB(XtraDB的别名)
b)诸多的扩展和新特性
c)较多的测试组件
d)truly open source
3.1、安装和使用MariaDB
https://blog.51cto.com/xiexiaojun/1679995
CentOS 7直接提供:yum -y install mariadb-server
CentOS 6 通用二进制安装
CentOS 6: 通用二进制格式安装MariaDB 1、获取源码 官方站点:www.mariadb.org 2、安装MariDB 1)添加用户 2)准备数据库 3)展开及配置 3、测试启动服务并登陆MariaDB 4、安全初始化 5、通用配置 1、获取源码 2、安装MariaDB 1) 添加用户: # groupadd -r -g 306 mysql # useradd -r -g 306 -u 306 mysql 2) 准备数据库: # btrfs # lvm2 快照,数据库备份 # fdisk -l /dev/[sh]d[a-z] //查看所有磁盘 # fdisk /dev/sda //管理指定磁盘 # partx -a /dev/sda # partx -a /dev/sda # pvcreate /dev/sda3 # vgcreate vg0 /dev/sda3 # lvcreate -L 10G -n mylv vg0 # 查看可被格式的文件系统类型 # cat /proc/filesystems **没有xfs,xfs比ext文件易扩展,易用 # 查看模块 # lsmod # 安装使用xfs文件系统 # yum search xfs //xfsprogs.i686 : Utilities for managing the XFS filesystem 文件系统组成: 模块、用户空间的管理工具、POSIX # yum -y install xfsprogs # 安装后查看内核中的模块 # rpm -ql xfsprogs //只提供程序,并未提供模块 # modinfo xfs //没有此模块 # modprobe xfs //如果有则可以安装 # mke2fs -t ext4 /dev/vg0/mylv # vim /etc/fstab /dev/vg0/mylv /mydata/data ext4 defaults 1 2 # mkdir -p /mydata/data # chown mysql.mysql /mydata/data # mount -a 3) 展开及配置: 展开: # tar xf mariadb-5.5.57-linux-i686.tar.gz -C /usr/local/ # cd /usr/local/ # ls //查看文件 # ln -sv mariadb-5.5.57-linux-i686 mysql # ll //查看链接 # cd mysql # ll //查看权限 # chown -R mysql:mysql ./* # ll //确认 元数据生成: # scripts/mysql_install_db --help --user=user_name --basedir=path //指明mariadb的安装目录 --datadir=path //MariaDB的数据库的目录 --defaults-extra-file=name //配置文件 # /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --user=mysql --datadir=/mydata/data/ # ls /mydata/data //查看文件是否生成 准备配置文件: 配置文件读取路径: /etc/my.cnf --> /etc/mysql/my.cnf --> --default-extra-file=/PATH/TO/CONF_FILE --> ~/.my.cnf # mkdir /etc/mysql # ls support-files/ //查看提供的文件 1) my*.cnf //均为配置 large(512M内存), meduim(256M), small(64M) 内存4G innodb-heavy-4G.cnf 2) mysql.server //提供的服务脚本 # cp support-files/my-large.cnf /etc/mysql/my.cnf 修改配置文件: 配置文件类ini格式, 相同配置段出现多次时,最后一个配置段为最终生效段. [client] #password = your_password port = 3306 socket = /tmp/mysql.sock //客户端通过/tmp/mysql.sock与服务端通信 [mysqld] port = 3306 //服务端监听的端口 socket = /tmp/mysql.sock //服务端监听在unix socket # Try number of CPU's*2 for thread_concurrency 线程数为CPU核心数的2倍 thread_concurrency = 4 -------- datadir = /mydata/data //数据库的目录 innodb_file_per_table = on //innodb的特性,每个文件当作一个表 skip_name_resolve = on //跳过IP-->反解为主机名.授权只基于IP即可,加速 准备服务脚本 # ls support-files/ //查看服务脚本的位置及权限 # cp support-files/mysql.server /etc/rc.d/init.d/mysqld # chkconfig --add mysqld # chkconfig --list mysqld 4)测试启动服务 # ss -tnl //查看3306端口是否被占用 # service mysqld start /usr/local/mysql/bin/mysqld_safe_helper: Can't create/write to file '/var/log/mysqld.log' (Errcode: 13) # touch /var/log/mysqld.log # chown root.mysql /var/log/mysqld.log # chmod 660 /var/log/mysqld.log # /usr/local/mysql/bin/mysql MariaDB [(none)]> 5) 安全初始化 MariaDB [(none)]> SELECT User,Host,Password FROM mysql.user; +------+-----------------------+----------+ | User | Host | Password | +------+-----------------------+----------+ | root | localhost | | | root | localhost.localdomain | | | root | 127.0.0.1 | | | root | ::1 | | | | localhost | | | | localhost.localdomain | | +------+-----------------------+----------+ 6 rows in set (0.00 sec) 注意:在本地主机上root,及一个匿名用户没有对应的密码 # /usr/local/mysql/bin/mysql_secure_installation # /usr/local/mysql/bin/mysql -uroot -hlocalhost -pmagedu MariaDB [(none)]> 6)通用配置 查看安装目录 # ls /usr/local/mysql bin data include lib mysql-test scripts sql-bench COPYING EXCEPTIONS-CLIENT INSTALL-BINARY man README share support-files 1、导出PATH变量 # vim /etc/profile.d/mysql.sh export PATH=/usr/local/mysql/bin:$PATH # . /etc/profile.d/mysql.sh 2、导出库文件 # vim /etc/ld.so.conf.d/mysql.conf /usr/local/mysql/lib # ldconfig [-v] 3、导出头文件 # ln -sv /usr/local/mysql/include /usr/include/mysql 4、导出man手册 # vim /etc/man.config MANPATH /usr/local/mysql/man
安装后的设定:
(1)为所有root用户设定密码:
mysql>update mysql.user SET password=PASSWORD('your_pass') WHERE cluase;
mysql>flush privileges;
(2)删除所有匿名用户
mysql>DROP USER ''@'localhost';
(3)建议关闭主机名反解功能
3.2、MariaDB程序组成
# ls /usr/local/mysql/bin 1、服务端程序 mysqld_safe[ps命令即可查询:"线程安全的mysql"] mysqld_multi["多个mysql,使用不同的端口"] mysqld
mysql协议:数据存储协议:C/S架构 实现: mysqld 进程间的通信: 同主机通信:unix socket、message queue(signal)、share memory、semphor(旗语) 跨主机:socket、rpc--监听在tcp的3306端口,支持远程通信 mysqld同主机:基于unix socket通信 服务器监听在: server地址: localhost, 127.0.0.1 二进制安装:/tmp/mysql.sock rpm安装: /var/lib/mysql/mysql.sock 2、客户端程序 mysql CLI、GUI(phpMyadmin) mysqladmin mysqlbinlog 二进制日志管理 mysqldump CLI交互式客户端程序: mysql使用 mysql [-uUSERNAME] [-hHOST] [-pPASSWORD] 注意: 1、mysql用户名: 'USERNAME'@'HOST' HOST:支持通配符: % 匹配任意长度的任意字符 _ 匹配任意单个字符 例如: 172.16.0.0/16网络用通配符表示 172.16.% 172.16.0.% 172.16.%.% 2、不给-u: 默认用户名为root 不给-h: 默认HOST为localhost或127.0.0.1 不给-p: 默认PASSWORD为空
3.3、SQL接口
SQL接口: 与mysqld相互 MariaDB [(none)]> 客户端命令:本地执行 命令名 简写格式 help (\?) //获取帮助 clear (\c) //清空输入的内容 ego (\G) 垂直显示结果 quit (\q) //退出mysql, status (\s) //查看服务器的状态信息 system (\!) //执行shell命令 use (\u) use DB, 设定默认数据库 服务端命令:通过mysql协议发往服务器端,执行并取回结果,命令有结束符";" > SELECT VERSION(); 调用函数并执行 > SELECT 1+1; > SELECT 0.99^365 > SELECT 1.0^365
3.4、关系型数据库的常见组件、
SQL 过程是编程,自定义函数(UDF),内置函数(IDF)
数据库:database
表 :table
行:row
列:column
索引:index
视图:view
并行多用户访问:
用户:USER
权限:PRIVILEGES
------运维需掌握------------
DBA可调用的代码/函数
存储过程:procedure 没有返回值
存储函数:function 有返回值
触发器:触发额外代码执行
事件调试器:event scheduler [crontab 周期性任务计划]
3.5、SQL语句(注:对mysql命令不区分大小写)
DDL :Data Defination Language 数据定义语言
CREATE :创建数据库和数据库的一些对象
DROP : 删除数据表、索引、触发程序、条件约束以及数据表的权限等(没有回收站,执行动作后数据会从磁盘中抹去)
ALTER:修改数据表定义及属性
DML:Data Manipulation Language 数据操作语言 (向表中插入、修改、查询)
INSERT 、DELETE 、UPDATE 、SELECT
DCL : Data Control Language 数据控制语言
Grant : 允许对象的创建者给某用户或某组或所有用户 赋予某些特定的权限
Revoke : 可以废除某用户或某组或所有用户访问权限
注意:写的格式统一,因为mysql缓存是根据MD5值存储缓存。如果两次输入的字母大小写不同时,其MD5值不同。
3.6、数据库管理
查看 :SHOW DATABASES;
语法:
创建数据库 :CREATE DATABASE | [IF NOT EXISTS] "db_name" [create_specification];
删除数据库 :DROP DATABASE | [IF NOT EXISTS] "db_name" [create_specification]; <没有回收站>只能基于备份恢复
create_specification:
CHARACTER SET 'charecter set name' 字符集
COLLATE 'collate name' 排序规则
查看当前支持哪些字符集和排序规则:
>SHOW CHARACTER SET ;
>SHOW COLLATION ;
获取命令帮助:
3.7、表:
CREATE TABLE tb_name (col1 datatype 修饰符,col2 datatype 修饰符,...) ENGINE=' '
查看所有的引擎:>SHOW ENGINE;
查看表:SHOW TABLES [FROM db_name]
查看表结构:DESC [db_name.]tb_name
删除表:DROP TABLE tb_name ;
3.8、数据类型、
数据类型: datatype
字符:
定长字符:
不区分大小写 char(#) 用或不用,给1个占10个
区分大小写 binary(#)
变长字符:
不区分大小写 varchar(#) 有结束符,占用一个, 给1个,占2个
区分大小写 varbinary(#)
对象存储:大文本存储
TEXT 不区分大小写
BLOB 区分----二进制的大对象
内置:
ENUM 枚举(给你几种,最多有几种选择)
SET 集合
数值:
精确:整型[int]、十进制[decimal]
int
tinyint 1byte
smallint 2bytes
mediumint 3bytes
int 4bytes
bigint 8bytes 范围: 0 - 2^64-1
近似: 单精度浮点[float]、双精度浮点[double]
修饰
NOT NULL :非空约束
DEFAULT NULL :设定默认值
https://blog.51cto.com/sonlich/1970069