1 查版本

  1. select version();

查询消耗时间排序:

  1. select statReportId,startTime,endTime, (endTime-startTime) as consumes from realtime_stat.log_stat_report_mysql where date(startTime) ='2020-07-28' order by consumes desc;

2 备份

https://www.cnblogs.com/chenmh/p/5300370.html

1.导出所有数据库
该命令会导出包括系统数据库在内的所有数据库
mysqldump -uroot -proot --all-databases >/tmp/all.sql
2.导出db1、db2两个数据库的所有数据
mysqldump -uroot -proot --databases db1 db2 >/tmp/user.sql

参数名 缩写 含义
—host -h 服务器IP地址
—port -P 服务器端口号
—user -u MySQL 用户名
—pasword -p MySQL 密码
—databases 指定要备份的数据库
—all-databases 备份mysql服务器上的所有数据库
—compact 压缩模式,产生更少的输出
—comments 添加注释信息
—complete-insert 输出完成的插入语句
—lock-tables 备份前,锁定所有数据库表
—no-create-db/—no-create-info 禁止生成创建数据库语句
—force 当出现错误时仍然继续备份操作
—default-character-set 指定默认字符集
—add-locks 备份数据库表时锁定数据库表
-d 只生成创建表结构的语句
-t 只生成插入数据的语句
-T -T必须加目录,且不用重定向某个文件,自动生成两个文件:一个.sql文件,创建表结构的语句;一个.txt文件,数据文件,相当于select into outfile

导出

  1. mysqldump --u root -h 172.16.16.212 -p'youai123' -P3306 -d --databases report_ix >report_ix.sql

去掉锁表及语句加锁

  1. mysqldump --skip-lock-tables --skip-add-locks -u root -h 172.16.16.212 -p'youai123' -P3306 --databases dolphinscheduler >/data/backup/dolphinscheduler.sql
  1. 还原备份数据

mysql -uroot -p database_name < /backup/mysqldump/db_name.sql

3 小数

  1. # 保留两位小数向上
  2. select ceil(2.491*100)/100;
  3. # 保留两位小数四舍五入
  4. select round(2.495,2);
  5. # 保留两位小数向下
  6. select truncate(2.495,2);
  7. # 向上取整
  8. select ceil(32.1);
  9. # 向下取整
  10. select floor(32.9);

4 修改编码

  1. -- 查看
  2. show variables like 'character_set_database';
  3. -- 修改
  4. alter database analysis character set utf8; -- 推荐使用utf8mb4
  5. --
  6. set names utf8;
  • 终端中文乱码
    set character_set_results=utf8;

5看数据库,表占用磁盘大小

  • 查询所有数据库占用磁盘空间大小
  1. select
  2. TABLE_SCHEMA,
  3. concat(truncate(sum(data_length)/1024/1024,2),' MB') as data_size,
  4. concat(truncate(sum(index_length)/1024/1024,2),'MB') as index_size
  5. from information_schema.tables
  6. group by TABLE_SCHEMA
  7. ORDER BY data_size desc;
  8. #order by data_length desc;
  • 所有库表

    1. select
    2. table_schema as '数据库',
    3. table_name as '表名',
    4. table_rows as '记录数',
    5. truncate(data_length/1024/1024/1024, 2) as '数据容量(GB)',
    6. truncate(index_length/1024/1024, 2) as '索引容量(MB)'
    7. from information_schema.tables
    8. order by data_length desc, index_length desc;
  • 查询单个库中所有表磁盘占用大小

    1. select
    2. TABLE_NAME,
    3. concat(truncate(data_length/1024/1024,2),' MB') as data_size,
    4. concat(truncate(index_length/1024/1024,2),' MB') as index_size
    5. from information_schema.tables
    6. where TABLE_SCHEMA = 'DB_NAME'
    7. group by TABLE_NAME
    8. order by data_length desc;

6 union all 和 union

union all 不去重,不排序; union 会去重与进行默认规则的排序。 union all 性能好,因为无需额外去重与排序

7 left join on 和 where 条件的区别

两者放置相同条件,之所以可能会导致结果集不同,就是因为优先级。on的优先级是高于where的。
inner join

8 查询重复数据

  1. select * from tablename where id in (
  2. select id from tablename
  3. group by id
  4. having count(id) > 1
  5. )

根据name和code字段找到重复记录

  1. SELECT * from (SELECT *, CONCAT(name,code) as nameAndCode from tb_table) t WHERE t.nameAndCode in
  2. (
  3. SELECT nameAndCode from (SELECT CONCAT(name,code) as nameAndCode from tb_table) tt GROUP BY nameAndCode HAVING count(nameAndCode) > 1
  4. )
  • innodb和myisam的区别
  • mysql int类型 int(11) 和int(2)区别
  1. mysql字段定义中INT(x)中的x仅仅指的是显示宽度。
    显示宽度小于指定的列宽度的值时从左侧用数值0填满宽度(指定ZEROFILL时)
    如果设置了ZEROFILL扩展属性,默认就有了无符号属性UNSIGNED
    显示宽度并不限制可以在列内保存的值的范围
    显示宽度不限制超过列的指定宽度的值的显示
    所以INT(x)的定义与存储空间没有任何关系,都是4个字节。
  2. INT(x)的最大值和最小值与UNSIGNED有关
    有符号型范围 -2147483648 ~ 2147483647,即-2^31 ~ 2^31 - 1
    无符号型范围 0 ~ 4294967295,即2^32 - 1

int类型在内存中占4个字节,也就是用32位二进制表示,其中最高位为符号位,0表示正,1表示负。

int类型正数上限二进制表示为0111 1111 1111 1111即(2^32)-1,表示0的符号位是0(即最高位是0):0000 0000 0000 0000
由于0已经被正数这一边表示了,所以负数的1000 0000 0000 0000就可以用来表示-2^32

  • MYSQL字符型数据初始值,default 为 null 好还是空串好?

如果是允许null的列,对索引会有影响(索引不会包括有NULL值)。
影响索引的统计信息,影响优化器的判断。
可空列被索引后,每条记录都需要额外的字节。
复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。
所以我们在表设计时不要让字段的默认值为NULL。

  • 为什么一定要用自增ID作为主键?

    1.InnoDB按主键聚集,自增可以防止页分裂。

    2.所有索引都包含主键。

    3.方便优化分页

  • 查询优化

    1.绝对禁止使用select * 和insert into 不带字段
    a) 防止业务需求需对表进行DDL时,造成字段数不匹配的故障。
    b) 使用select(col…)、分页,只获取需要的数据列和行,避免不需要的字段造成较大的网络开销

  • 重置密码

    1. 1.my.cnf skip-grant-tables
    2. 2.重启mysql
    3. 3.进入客户端设置
    4. update mysql.user set password=password('你要重置的密码') where user='root' and host='localhost';
    5. 或较新的版本
    6. alter user root@localhost identified by 'NewPass';
    7. flush privileges;
  • 添加用户

    1. create user ‘用户名‘@‘主机名‘ identified by ‘密码‘;
  • 开放访问权限
    ```

  1. 允许任意主机以用户bd和密码bdpw连接到local服务器 GRANT ALL PRIVILEGES ON . TO ‘bd’@’%’ IDENTIFIED BY ‘bdpw’ WITH GRANT OPTION; flush privileges;

  2. 允许特定的IP地址以用户bd和密码bdpw连接到local服务器 GRANT ALL PRIVILEGES ON . TO ‘bd’@’172.16.4.198’ DENTIFIED BY ‘bdpw’ WITH GRANT OPTION; flush privileges; ```

    注意:

    1. 在Command Line Client输入密码 或 进入Nivacat的命令行界面,
    2. 输入:_use mysql;_
    3. 查询host输入: select user,host from user;
      如果有host值为%的,则直接执行授权语句;如果没有,则执行第4步
    4. 创建host
      如果没有”%”这个host值,选择某个开放出去的用户(bd),执行
      mysql> update user set host=’%’ where user=’bd’;
      mysql> flush privileges;
    5. 授权用户*.* 表明授权所有权限
  • 变量
    1. # 查看端口
    2. show variables like 'port';

配置Ubuntu的防火墙

  • 打开3306端口:sudo ufw allow 3306
  • 开启防火墙:sudo ufw enable
  • 设置默认的防火墙防御:sudo ufw default deny
  • 查看防火墙的状态:sudo ufw status