视图

阿里的开发规范有明确要求,不允许使用视图或者存储过程。因为存储过程或者函数使数据库做了过多应用层应该做的事情。视图为什么不能使用呢,这是因为视图中可能含有慢查询的语句,在定位问题时不能快速的定位问题。一般情况是数据库不行承担过多职责,上层应该承担这部分职责。

count(1)、count(*) 、count(列名)

执行效果

  • count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为 NULL

  • count(1)包括了忽略所有列,用 1 代表代码行,在统计结果的时候,不会忽略列值为 NULL

  • count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者 0,而是表示 null)的计数,即某个字段值为 NULL 时,不统计

执行速度

  • 列名为主键,count(列名)会比 count(1)快

  • 列名不为主键,count(1)会比 count(列名)快

  • 如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)

  • 如果有主键,则 select count(主键)的执行效率是最优的

  • 如果表只有一个字段,则 select count(*)最优

is null

记住不是等于null,一定是is null

建表

阿里巴巴开发手册中强调

【强制】P0J0类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。

反例:定义为基本数据类型Boolean isDeleted的属性,它的方法也是isDeleted(),RPC框架在反向解析的时候,“以为”对应的属性名称是deleted,导致属性获取不到,进而抛出异常。

然后建表的时候,通常都要有主键,创建时间,更新时间,还有deleted或enabled

执行顺序

from(加载表) -> join -> on -> where -> group by->select -> count,sum -> having -> distinct -> order by -> limit

慢查询日志

方法一:

# 查看是否开启慢查询日志

show variables like'%query_log%';
show variables like 'slow%';
#开启慢查询
set global slow_query_log = ON;
#修改慢sql的阈值,sql执行超过阈值的时候就会记录到慢日志的log文件中。
set global slow_launch_time = 3;

方法二:

# 在linux中编辑my.cnf开启慢查询

vim /etc/mysql/my.cnf

# 在[mysqld]下面添加内容

slow_query_log = ON

slow_query_log_file = /var/lib/mysql/tmp_slow.log //linux

long_query_time = 1

全量备份

docker exec -it 容器名 mysqldump -u账号 -p密码 --all-databases > ./all-databases.sql

创建只读权限的用户

CREATE USER 'readonly'@'%' IDENTIFIED BY 'Ab123!@#';
GRANT SELECT ON *.* TO 'readonly'@'%';
REVOKE INSERT, UPDATE, DELETE, DROP, CREATE, ALTER, INDEX, EXECUTE ON *.* FROM 'readonly'@'%';
FLUSH PRIVILEGES;