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用于保证事务特性的日志文件:`
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容