读书:深入浅出MySQL++数据库开发、优化与管理维护+第2版

 

 

第一部分 基础篇

一 mysql安装与配置


windows安装:
安装选项: 多功能数据库(innodb,myisam都友好)  
事务数据库(innodb友好,myisam也支持) 非事务数据库(不能用innodb)
启动关闭 net start/stop mysql
Linux启动和关闭: servie mysql stop


二 sql基础


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |  存储数据库对象信息,用户表、列、权限、字符集、分区信息
| mysql              |  存储了用户权限信息
| performance_schema |
| test               |  测试数据库,任何用户都可以使用
| test1              |
+--------------------+

DDL语句:  --一般管理员用的多,开发用的少

 create table emp(
 enname varchar(10),
 hiredate date,
 sal decimal(10,2),
 deptno int(2));

desc emp;
show create table emp;
对表操作
修改类型:   alter table emp modify enname varchar(20);
增加表字段: alter table emp add column age int(3);
删除表字段: alter table emp drop column age;
字段改名:   alter table emp change sal sal1 decimal(10,3);
change和modify都可以修改表定义,change需要写2次列名,不方便,但是可以改列名称。modify不能。

修改字段排列顺序:
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| enname   | varchar(20)   | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| sal      | decimal(10,2) | YES  |     | NULL    |       |
| deptno   | int(2)        | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
新增字段birth date 在hiredate之后:
alter table emp add birth date after hiredate;
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| enname   | varchar(20)   | YES  |     | NULL    |       |
| hiredate | date          | YES  |     | NULL    |       |
| birth    | date          | YES  |     | NULL    |       |

修改字段 sql,放在最前
alter table emp modify birth date first;   --或者after hiredate
mysql> desc emp;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| birth    | date          | YES  |     | NULL    |       |
| enname   | varchar(20)   | YES  |     | NULL    |       |

更改表名
alter table emp rename emp1;

DML语句:
插入:

mysql> desc emp;
+--------+---------------+------+-----+---------+-------+
| Field  | Type          | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| birth  | date          | YES  |     | NULL    |       |
| enname | varchar(20)   | YES  |     | NULL    |       |
| sal    | decimal(10,2) | YES  |     | NULL    |       |
| deptno | int(2)        | YES  |     | NULL    |       |
+--------+---------------+------+-----+---------+-------+
#10位数字,末尾2位是小数,
全插:insert into emp(birth,enname,sal,deptno) values('2020-01-19','xixi',300.10,2);
全插省略:insert into emp values('2020-01-19','xixi',300.10,2);
一次性插入多条语句,注意逗号:
insert into emp values
('2020-01-19','xixi2',300.10,2),
('2020-01-19','xixi3',300.10,2),
('2020-01-19','xixi4',300.10,2);

部分插入有空格:
部分插入: insert into emp (birth,enname) values('2020-01-19','xixi');

更新语句:
update emp set sal=300.20 where enname='xixi4';

更新多个表字段: 
mysql> select * from dept;
+--------+----------+
| deptno | deptname |
+--------+----------+
|     12 | hehe     |
|     12 | haha     |
+--------+----------+
2 rows in set (0.00 sec)

mysql> select * from emp limit 2;
+------------+--------+--------+--------+
| birth      | enname | sal    | deptno |
+------------+--------+--------+--------+
| 2020-01-19 | haha   | 300.10 |      2 |
| 2020-01-19 | xixi   |   NULL |   NULL |
+------------+--------+--------+--------+

update emp e,dept d set e.sal=e.sal*d.deptno,d.deptno=1 where d.deptname=e.enname;

删除记录:
delete from emp where  enname='xixi4';
多表删除
delete emp e,dept d where d.deptname=e.enname and e.sal=100;

查询语句:
select * from emp where enname='haha' and deptno !=2;
select * from emp order by enname desc;
select enname,count(*) from emp group by enname;
select enname,count(*) from emp where sal>100 group by enname;

表连接:
内连接:选出互相匹配的记录
外连接:选出不同的记录
左连接: 左边所有加右边没有的空
右连接: 右边所有加左边没有
左右连接可以相互转化。

子查询:需要的条件是另外一个select的结果。 关键字 in、not in、=、!=、exists、not exists。
select * from emp where enname in(select deptname from dept);

联合查询:
mysql>  select enname from emp union select deptname from dept;
+--------+
| enname |
+--------+
| haha   |
| xixi   |
| hehe   |
+--------+
mysql>  select enname from emp union all select deptname from dept;
+--------+
| enname |
+--------+
| haha   |
| xixi   |
| haha   |
| haha   |
| hehe   |
| haha   |
+--------+

DCL语句
DCl 语句主要书DBA用来管理系统中的对象权限使用
创建一个用户xixi,具有对test库中所有表查询的权限。
grant select,insert on test.* to 'xixi'@'localhost' identified by '123';

帮助命令 ?命令      eg: ? show;

查询元数据信息:
业务需求: 删除test1库下面所有前缀未tmp的表;
           test1下的存储引起myisam 改为innodb;
表名、列名、列类型、索引名信息均存在information_schema 里面


三 myql支持的数据类型


int=integer
定点类型  dec(10,2)    
create table t1(id1 int,id2 int(5));
insert into t1(1,1);

不足补0:
alter table t1 modify id1 int zerofill;
mysql> select * from t1;
+------------+------+
| id1        | id2  |
+------------+------+
| 0000000001 |    1 |
+------------+------+
alter table t1 modify id2 int(5) zerofill;

超出宽度也不怕:
mysql> select * from t1;
+------------+-------+
| id1        | id2   |
+------------+-------+
| 0000000001 | 00001 |
+------------+-------+

mysql> insert into t1 values(222,1234567);
mysql> select * from t1;
+------------+---------+
| id1        | id2     |
+------------+---------+
| 0000000001 |   00001 |
| 0000000222 | 1234567 |


时间类型:
mysql> create table t (d date,t time,dt datetime);
mysql> desc t;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| d     | date     | YES  |     | NULL    |       |
| t     | time     | YES  |     | NULL    |       |
| dt    | datetime | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+

mysql> insert into t values(now(),now(),now());
mysql> select * from t;
+------------+----------+---------------------+
| d          | t        | dt                  |
+------------+----------+---------------------+
| 2020-01-20 | 03:52:19 | 2020-01-20 03:52:19 |
+------------+----------+---------------------+
--datetime是date和time的组合

四 mysql中的运算符


算术运算符
比较运算符
逻辑运算符
mysql> select not 0,not 1,not null;
+-------+-------+----------+
| not 0 | not 1 | not null |
+-------+-------+----------+
|     1 |     0 |     NULL |
+-------+-------+----------+

五 常用函数


1、字符串函数
2、数值函数 abs()
mysql> select abs(-3);
+---------+
| abs(-3) |
+---------+
|       3 |
+---------+
3、日期和时间函数
select curdate(); 当前日期
select curtime();
select now();
4、流程函数 
if ifnull(判断null值函数),case when

create table salary (userid int,salary decimal(9,2));
insert into salary values(1,1000),(2,2000),(3,3000),(4,4000),(5,5000),(1,null);
select * from salary;
月薪高于2000属于高薪,2000一下低薪
select if(salary>2000,'high','low') from salary;
null值用0替换
select ifnull(salary,0) from salary;

select case salary when 1000 then 'low' when 2000 then 'mid' else 'high' end from salary;

6、其他函数


select database();
select version();
select user();
select inet_ntoa(3232235777);  换算ip地址
ip地址比较: inet_aton函数
 


第二部分 开发篇


存储引擎


show engines \G;
show variables like 'have%';
修改表存储引擎: alter table t engine=myisam;
1、myisam    不支持事务,外键   访问速度快,读和插入操作为主,很少的更新删除。
.frm 存储表定义
.myd 存储数据
.myi 存储索引   --数据文件和索引文件可以放在不通的目录,平均io,获得更快速度。

2、innodb  事务
设置自动增长 alter table xixi auto_increment = n;

3、memory  快,大小限制
内存中建表 对应一个磁盘文件 .frm

第三方存储引擎

选择合适数据类型
char 与varcha
较大文本选择text或者blob

字符集


mysql的字符集和校对规则: 服务器级,数据库级,表,和字段
服务器可以在my.cnf 设置,获取启动选项中指定
查看:show variables like 'character_set_database';
查看表: show create table xixi \G;

character_set_client,character_set_connection,character_set_results.
客户端、连接和返回结果的字符集。
设置方式有2种
1、 set names ***;
2、 [mysql]
     default-character-set=gbk;

改表字符集
1、mysqldump --default-character-set=gbk  -d>xixi.sql   只导出表结构,修改语句,新字符集
2、mysqldump导出所有记录 >data.sql  修改data.sql里面的数据
3、建库,设置字符
create database databasename default charset utf8;
4、创建表,执行xixi.sql
mysql -uroot -p databasenaeme 5、导入数据
mysql -uroot -p databasename

索引的设计和使用


索引用于快速找出某个列种有一特定值的行,索引避免磁盘搜索。

 视图
 视图,虚拟的表
 show views;
 
存储过程:sql语句集合,光标,流程控制

触发器:只能建立在永久表上。

事务控制语句和锁定语句
lock table 和unlock table

sql安全,sql注入 :绑定变量,应用程序转行函数。


mysql分区:把一个表分为更小部分。逻辑一个表,10个物理分区组成。

 

 

第三部分 优化篇

 

第四部分 管理维护篇

第五部分 架构篇

mysql的复制:  将主数据库的ddl和dml操作通过(二进制文件)到从库上,从库对日志重新执行,重做

更新不频繁或者实时性要求不高从库查询,实时性高的主库查询。

原理:

1、主库提交事务把数据变更作为事件event记录在二进制文件的binlog,主库的sync_binlog参数控制binlog日志刷新到磁盘。

2、主库推送的二进制日志文件binlog中的事件到从库的中继日志relay log,之后从库应用日志,实现逻辑复制

3、涉及3个线程。  主库的binlog dump线程,从库的i/o线程和sql线程。

从库启动复制,创建i/o线程连接主库,主库创建binlog dump线程读取数据库事件发送改i/o线程,i/o线程然后更新到从库的中继日志rela log,从库的sql线程读取中继日志更新到数据库事件并应有。

读书:深入浅出MySQL++数据库开发、优化与管理维护+第2版_第1张图片

主库: show processlist\G   查看binlog dump线程。

从库: show processlist\G   查看io和sql线程。    --异步,存在一定延时

涉及2种重要文件: 

    二进制日志文件(3种记录方式)和中继日志文件。   

   查看是否开启:show variables like '%log_bin';

   查看哪种方式记录:show variables like '%binlog_format%';

   查看所有二进制:show binary/master logs;

   查看当前使用:show master status;

   中继日志:和二进制一样,区别是sql执行后会删除。

   http://www.zsythink.net/archives/1286

从库会创建master.info和relay-log.info保持复制进度,记录从库io线程读取主库binlog的进度和应用日志的进度。

读书:深入浅出MySQL++数据库开发、优化与管理维护+第2版_第2张图片

 

一主多从

读书:深入浅出MySQL++数据库开发、优化与管理维护+第2版_第3张图片

 

mysql库只应用和自己server id不同的应用日志(binlog中记录了server id),双主不会循环利用

半同步复制,解决主库可能宕机,事务流失的可能。

主库锁表: flush tables with read lock;

unlock tabls;

集群

读书:深入浅出MySQL++数据库开发、优化与管理维护+第2版_第4张图片

高可用架构

mmm  master-master-manager  双主切换和管理的脚本程序,但同意时刻只能对一个主写操作,

mha 高可用方案,30s内切换,数据几乎不丢失。   --类似领导监控,出问题就换master

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(工具)