Mariadb数据库

mariadb官方站点
mysql --> mariadb --> Percona-server(对InnoDB存储引擎的增强)

概念描述:

特性1.插件式存储引擎 2.单进程多线程
数据库表、索引、视图(虚表)、SQL语句(接口)、存储过程、存储函数、触发器(判断)、事件调度器(类似计划任务);
约束
# 主键约束:唯一、非空;一张表只能有一个;
# 唯一键约束:唯一时,可以存在多个;
# 外键约束:参考性约束;
# 检查性约束:check;
MySQL的数据类型
# 字符型
# 数值型
# 日期时间型
# 内建类型
字符型

VARCHAR(#), VARBINARY(#):变长型(存储空间是变化的)
TEXT(对象存储,不区分字符大小写):TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT
BLOB(对象存储,区分字符大小写):TINYBLOB,BLOB,MEDIUMBLOB, LONGBLOB```
**数组型**:

浮点型(近似):FLOAT(单精度),DOUBLE(双精度),REAL(实数),BIT(位)
整型(精确):1.INTEGER(整数),包含:TINYINT(从0到255的整型数据),SMALLINT,MEDIUMINT,INT,BIGINT
2.DECIMAL(十进制小数)

**日期时间型:**

日期:DATE
时间:TIME
日期时间:DATETIME
时间戳:TIMESTAMP
年份:YEAR(2), YEAR(4)```
內建类型:

ENUM:枚举
    例:ENUM('Sun','Mon','Tue','Wed')
SET:集合```
####类型修饰符:
```1.字符型:NOT NULL(不能为空),NULL(为空),DEFAULT ‘STRING’,CHARACET SET(字符集格式) ‘utf8’,COLLATION(格式排序) ‘collocation'
2.整型:NOT NULL, NULL, DEFAULT value, AUTO_INCREMENT(自动增长), UNSIGNED(无符号)
3.日期时间型:NOT NULL, NULL, DEFAULT``` 


**安装**
    1. apm
    2. 源码(注意mysql5.5之后构建工具已经是cmake)
    3. 二进制安装

*服务端程序*:
      - mysqld, mysqld_safe, mysqld_multi(多示例)
*客户端程序*:
      - mysql, mysqldump备份, mysqlbinlog日志, mysqladmin管理, ...
### mysql常用选项:
1. -h 服务端地址
2. -u 用户名
3. -p 密码
4. -S socket_path
5. -D db_name
6. -C 数据压缩传输
7. -e 非交互模式执行SQL语句
8. -E 查询结果纵向显示
9. -P 端口

### sql语句两种类型:
- DDL:操作数据库对象
                mysql> HELP Data Definition
- DML: 操作表中的数据(增删改查)
                mysql> HELP Data Manipulation
#### DDL:```三种命令:CREATE, ALTER, DROP```
> 对象:DATABASE, TABLE,INDEX, VIEW (**注意数据库操作都是不可逆的,请提前做好备份**)
例:
```create database mydb;```创建数据库
```MariaDB [mysql]> create table tbl1(id INT);```创建表和定义主键
```create table tbl6 SELECT * from mysql.user;```复制mysql.user的表内容到新表
```create table tbl7 like mysql.user;```复制mysql.user的表结构到新表
```DESC tbl_name;```查看表结构
```select * from tbl7;```查看表内容
```ALTER TABLE tbl4 ADD gender ENUM('man','woman') NOT NULL DEFAULT 'man';```修改表内容(增加一个枚举类型)
```alter table tbl4 MODIFY gender ENUM('Man','Woman') NOT NULL DEFAULT 'Man';```修改字段类型
```alter table tbl4 CHANGE gender Gender ENUM('Man','Woman') NOT NULL DEFAULT 'Man';```修改字段名称
```alter table tbl4 ADD INDEX (age);```添加指定字段的索引(表中数据很多时,创建索引必不可少;如果就几百行数据大可不建立,因为索引能加速read操作,却会影响write操作)
```alter table tbl4 DROP INDEX age;```删除指定字段的索引
```create VIEW user AS SELECT Host,User FROM tbl6;```以tbl6表创建一个虚表叫user(视图)
```SHOW TABLE STATUS WHERE Comment='VIEW'\G;```查看哪些是视图
```alter VIEW user AS SELECT Host FROM tbl6;```修改视图(改的是后面的select语句)
``` drop VIEW user;```删除视图

#### DML:```四种命令(增删改查):INSERT/REPLACE,DELETE,UPDATE,SELECT```
>对象:TABLE (**注意数据库操作都是不可逆的,请提前做好备份**)
例:
```insert into tbl4 values (1,'tom',13,'Man');```向tbl4表中插入各类值
```insert into tbl4 (name,age) values ('du',23);```向指定的字段插入数据
```insert into tbl4 (name,age) values ('test1',23),('test2',24);```多行插入数据
```FROM过滤表  --> WHERE过滤行 --> Group By分组 --> Having分组过滤 --> Order BY排序 --> SELECT选取字段 --> Limit查询限制 ```**select语句执行流程**
```select * from tbl4 where age>=23;```根据年龄大于等于23查询
```select gender,avg(age) from tbl4;```查询年龄的平均值并根据性别显示出来
```select gender,min(age) from tbl4 group by gender;```把结果进行分组以用于聚合运算,还有avg(age),min(age),sum(age),count(id)计数
```select * from tbl4 order by age;```根据选择的字段排序,后面接desc是降序
```select distinct age from tbl4;```对选择的字段去重显示
```select name AS student,age AS old from tbl4 order by age;```将name,age两个字段显示成你定义的名字
```select * from tbl4 where age is null;```查询age字段为空的数据
```select * from tbl4 where age between 13 and 23;```指定两者之间
```select * from tbl4 where age in (13,23);```指定列表
```select * from tbl4 where name like '%o%';```指定包含o的字符
```select * from tbl4 where name rlike '^t.*';```用正则匹配以t开头的字符
```select * from tbl4 where age > 13 and gender='Man';```数值与字符串的与关系,or就是满足其一即可
``` delete from tbl4 where id=1;```删除指定条件的字符(一定要有限制条件,否则将清空整个表)
```update tbl4 set age=91 where id=4;```修改指定条件的数值(要有限制条件,否则将修改整个表中指定字段的所有数据)
```update tbl4 set age=36 where id=7;```修改指定字符的值
注意:sql_safe_updates 不带像where这样条件时,这个变量可阻止更新操作;启用命令:```set session sql_safe_updates=1;```长期有效得写在/etc/my.cnf配置文件中;还有在配置文件中加入其他特性:```innodb_file_per_table=ON```每表使用单独表空间,```skip_name_resolve=ON```跳过域名解析
```select name,age from students where age>40 union select name,age from teachers where age>40;```联合查询
``` truncate tbl6;```清空一张表(不可逆!)

####存储引擎
> 表类型:表级别概念,不建议在同一个库中的表上使用不同的ENGINE;因为不同的引擎体现的表特性也不同,比如InnoDB引擎支持事务,遇到操作问题时可以回滚;而MyISAM引擎不支持事务,外键等特性,不能回滚;但需要知道的是InnoDB引擎需要大量的内存空间才能体现其性能;
- 常见的存储引擎:show engines:
```MyISAM, Aria(前者的增强版), InnoDB, MRG_MYISAM, CSV, BLACKHOLE, MEMORY, PERFORMANCE_SCHEMA, ARCHIVE``` 
   - InnoDB:事务型存储引擎,适合对事务要求较高的场景中;但较适用于处理大量短期事务;支持高并发等;  锁粒度:行级锁;间隙锁;
   - MyISAM:支持全文索引,压缩,空间函数,不支持事务,崩溃无法保证表安全恢复;适用场景:只读或读多写少的场景、较小的表;  锁粒度:表级锁
- 创建表引擎:```create table tbl1 (id INT) engine = InnoDB;```
- 显示某个表引擎:```show table status where name = 'tbl1';```

####并发控制(锁):
> - 锁类型 :
   - 读锁:共享锁,可被多个读操作共享
   - 写锁:排它锁,独占锁
- 锁粒度(锁多少资源):
   - 表锁:在表级别施加锁,并发性较低;
   - 行锁:在行级另施加锁,并发性较高;
- 使用:
   - LOCK TABLES  tbl_name  read|write, tbl_name read|write, ...加锁
   - UNLOCK TABLES 解锁
   - 施加多个锁,例:```flush tables tbl1,tbl2 with read lock;```
   - 施加所有锁,例:```flush tables with read lock;``` ```(可以在温备份时用,备份时别人能读,但不能写,这样备份就保证数据一致,备份完在解开)```

####MySQL用户和权限管理:
- 创建用户:
      CREATE USER  'user'@'host' [IDENTIFIED BY [PASSWORD] 'password'] [,'user'@'host' [IDENTIFIED BY [PASSWORD]'password']...]
mysql_secure_installation  一般安装完mysql都要启动此安全配置:给管理员设定密码,删除匿名用户,删除test库并重载授权表
- 重命名:
   ```RENAME USER old_user TO new_user```
- 删除用户:
```DROP USER 'user'@'host'```
```drop user ''@'localhost'; 删除匿名用户```
- 修改用户密码:
```(1) SET PASSWORD [FOR 'user'@'host'] = PASSWORD('cleartext password');```
```(2) UPDATE mysql.user SET Password=PASSWORD('cleartext password')  WHERE User='USERNAME' AND Host='HOST';```
```(3) mysqladmin -uUSERNAME -hHOST -p  password 'NEW_PASS'```
   - 生效:FLUSH PRIVILEGES
- 忘记管理员密码的解决办法:
```(1) vim /usr/lib/systemd/system/mariadb.service:
    ExecStart=/usr/bin/mysqld_safe --basedir=/usr --skip-grant-tables --skip-networking```
```(2) systemctl daemon-reload    systemctl restart mariadb```
```(3)使用mysql命令此时没有密码,进入后修改管理员密码:update mysql.user set password=password('123') where user='root' and host='localhost';```
- 授权
```grant create on hidb.* to 'jerry'@'%';  授权jerry用户可以创建hidb库和里面的表;```
```grant index on hidb.* to 'jerry'@'%'; 授权可以创建索引;```
```SHOW GRANTS [FOR 'user'@'host' 查看授权```
```revoke create view on hidb.* from 'du'@'172.18.%.%'; 取消相应授权```
- 缓存  ``` 查询语句风格要统一,要么都大写,要么都小写```
缓存:k/v 
   - key:查询语句的hash值
   - value:查询语句的执行结果
- 索引   ```加速查询操作,一定程度上会降低写操作;```
 - B+ TREE:顺序存储,左前缀索引,适合于范围类型的数据查询
 - Hash索引:基于哈希表实现,特别适用于值的精确匹配查询;

- 日志
 - 查询日志:general_log(不建议开启)
 - 慢查询日志:log_slow_queries(判定性能问题)
 - 错误日志:log_error, log_warnings
                (1) mysqld启动和关闭过程 输出的信息; 
                (2) mysqld运行中产生的错误信息; 
                (3) event scheduler运行时产生的信息;
                (4) 主从复制架构中,从服务器复制线程启动时产生的日志;
 - 二进制日志:binlog
`用于记录引起数据改变(比如增删改)或存在引起数据改变的潜在可能性的语句(STATEMENT)或改变后的结果(ROW),也可能是二者混合;
SHOW MASTER STATUS; 查看当前正在使用的二进制日志文件
log_bin=/PATH/TO/BIN_LOG_FILE  启用二进制日志,配置文件中添加`
 - 中继日志:relay_log
`从服务器上记录下来从主服务器的二进制日志文件同步过来的事件;`
 - 事务日志:innodb_log
`事务型存储引擎innodb用于保证事务特性的日志文件:`

你可能感兴趣的:(Mariadb数据库)