MySQL 规范与性能优化,java 教程视频我赢职场
2、操作 delete 或者 update 语句,加个 limit(SQL 后悔药)
「降低写错 SQL 的代价」, 你在命令行执行这个 SQL 的时候,如果不加 limit,执行的时候一个**「不小心手抖」,可能数据全删掉了,如果「删错」**了呢?加了 limit 200,就不一样了。删错也只是丢失 200 条数据,可以通过 binlog 日志快速恢复的。
「SQL 效率很可能更高」,你在 SQL 行中,加了 limit 1,如果第一条就命中目标 return, 没有 limit 的话,还会继续执行扫描表。
「避免了长事务」,delete 执行时,如果 age 加了索引,MySQL 会将所有相关的行加写锁和间隙锁,所有执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。
「数据量大的话,容易把 CPU 打满」?,如果你删除数据量很大时,不加 limit 限制一下记录数,容易把 cpu 打满,导致越删越慢的。
3、设计表的时候,所有表和字段都添加相应的注释(SQL 规范优雅)
这个好习惯一定要养成啦,设计数据库表的时候,所有表和字段都添加相应的注释,后面更容易维护。
「反例:」
CREATE?TABLE?`acc
《一线大厂 Java 面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
ount`?(
id
?int(11)?NOT?NULL?AUTO_INCREMENT,
name
?varchar(255)?DEFAULT?NULL,
balance
?int(11)?DEFAULT?NULL,
create_time
?datetime?NOT?NULL?,
update_time
?datetime?NOT?NULL?ON?UPDATE?CURRENT_TIMESTAMP,
PRIMARY?KEY?(id
),
KEY?idx_name
?(name
)?USING?BTREE
)?ENGINE=InnoDB?AUTO_INCREMENT=1570068?DEFAULT?CHARSET=utf8;
「正例:」
CREATE?TABLE?account
?(
id
?int(11)?NOT?NULL?AUTO_INCREMENT?COMMENT?'主键 Id',
name
?varchar(255)?DEFAULT?NULL?COMMENT?'账户名',
balance
?int(11)?DEFAULT?NULL?COMMENT?'余额',
create_time
?datetime?NOT?NULL?COMMENT?'创建时间',
update_time
?datetime?NOT?NULL?ON?UPDATE?CURRENT_TIMESTAMP?COMMENT?'更新时间',
PRIMARY?KEY?(id
),
KEY?idx_name
?(name
)?USING?BTREE
)?ENGINE=InnoDB?AUTO_INCREMENT=1570068?DEFAULT?CHARSET=utf8?ROW_FORMAT=REDUNDANT?COMMENT='账户表';
4、SQL 书写格式,关键字大小保持一致,使用缩进。(SQL 规范优雅)
「反例:」
SELECT?stu.name,?sum(stu.score)?from?Student?stu?WHERE?stu.classNo?=?'1 班'?group?by?stu.name.
「正例:」
SELECT?stu.name,?sum(stu.score)
FROM?Student?stu
WHERE?stu.classNo?=?'1 班'
GROUP?BY?stu.name
5、INSERT 语句标明对应的字段名称(SQL 规范优雅)
「反例:」
insert?into?Student?values?('666','捡田螺的小男孩','100');
「正例:」
insert into Student(student_id,name,score) values ('666','捡田螺的小男孩','100');
6、变更 SQL 操作先在测试环境执行,写明详细的操作步骤以及回滚方案,并在上生产前 review。(SQL 后悔药)
变更 SQL 操作先在测试环境测试,避免有语法错误就放到生产上了。
变更 Sql 操作需要写明详细操作步骤,尤其有依赖关系的时候,如:先修改表结构再补充对应的数据。
变更 Sql 操作有回滚方案,并在上生产前,review 对应变更 SQL。
7、设计数据库表的时候,加上三个字段:主键,create_time,update_time。(SQL 规范优雅)
「反例:」
CREATE?TABLE?account
?(
name
?varchar(255)?DEFAULT?NULL?COMMENT?'账户名',
balance
?int(11)?DEFAULT?NULL?COMMENT?'余额',
)?ENGINE=InnoDB?AUTO_INCREMENT=1570068?DEFAULT?CHARSET=utf8?ROW_FORMAT=REDUNDANT?COMMENT='账户表';
「正例:」
CREATE?TABLE?account
?(
id
?int(11)?NOT?NULL?AUTO_INCREMENT?COMMENT?'主键 Id',
name
?varchar(255)?DEFAULT?NULL?COMMENT?'账户名',
balance
?int(11)?DEFAULT?NULL?COMMENT?'余额',
create_time
?datetime?NOT?NULL?COMMENT?'创建时间',
update_time
?datetime?NOT?NULL?ON?UPDATE?CURRENT_TIMESTAMP?COMMENT?'更新时间',
PRIMARY?KEY?(id
),
KEY?idx_name
?(name
)?USING?BTREE
)?ENGINE=InnoDB?AUTO_INCREMENT=1570068?DEFAULT?CHARSET=utf8?ROW_FORMAT=REDUNDANT?COMMENT='账户表';
「理由:」
主键一般都要加上的,没有主键的表是没有灵魂的
创建时间和更新时间的话,还是建议加上吧,详细审计、跟踪记录,都是有用的。
阿里开发手册也提到这个点,如图
8、写完 SQL 语句,检查 where,order by,group by 后面的列,多表关联的列是否已加索引,优先考虑组合索引。(SQL 性能优化)
「反例:」
select?*?from?user?
where?address?='深圳'?order?by?age;
「正例:」
添加索引
alter?table?user?add?index?idx_address_age?(address,age)
9、修改或删除重要数据前,要先备份,先备份,先备份(SQL 后悔药)
如果要修改或删除数据,在执行 SQL 前一定要先备份要修改的数据,万一误操作,还能吃口**「后悔药」**~
10、where 后面的字段,留意其数据类型的隐式转换(SQL 性能优化)
「反例:」
//userid 是 varchar 字符串类型
select * from user where userid =123;
「正例:」?
select?*?from?user?where?userid?='123';
「理由:」
因为不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL 会做隐式的类型转换,把它们转换为浮点数再做比较,最后导致索引失效
11、尽量把所有列定义为 NOT NULL(SQL 规范优雅)
「NOT NULL 列更节省空间」,NULL 列需要一个额外字节作为判断是否为 NULL 的标志位。
「NULL 列需要注意空指针问题」,NULL 列在计算和比较的时候,需要注意空指针问题。
12、修改或者删除 SQL,先写 WHERE 查一下,确认后再补充 delete 或 update(SQL 后悔药)
尤其在操作生产的数据时,遇到修改或者删除的 SQL,先加个 where 查询一下,确认 OK 之后,再执行 update 或者 delete 操作
13、减少不必要的字段返回,如使用 select <具体字段> 代替 select * (SQL 性能优化)
「反例:」
select?*?from?employee;
「正例:」
select id,name from employee;
理由:
节省资源、减少网络开销。
可能用到覆盖索引,减少回表,提高查询效率。
14、所有表必须使用 Innodb 存储引擎(SQL 规范优雅)
Innodb?「支持事务,支持行级锁,更好的恢复性」,高并发下性能更好,所以呢,没有特殊要求(即 Innodb 无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用 Innodb 存储引擎
15、数据库和表的字符集尽量统一使用 UTF8(SQL 规范优雅)
尽量统一使用 UTF8 编码
可以避免乱码问题
可以避免,不同字符集比较转换,导致的索引失效问题
「如果需要存储表情,那么选择 utf8mb4 来进行存储,注意它与 utf-8 编码的区别。」
begin;
update?account?set?balance?=1000000
where?name?='捡田螺的小男孩';
commit;
16、尽量使用 varchar 代替 char。(SQL 性能优化)
「反例:」
总结
蚂蚁面试比较重视基础,所以 Java 那些基本功一定要扎实。蚂蚁的工作环境还是挺赞的,因为我面的是稳定性保障部门,还有许多单独的小组,什么三年 1 班,很有青春的感觉。面试官基本水平都比较高,基本都 P7 以上,除了基础还问了不少架构设计方面的问题,收获还是挺大的。
经历这次面试我还通过一些渠道发现了需要大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级 Java 面试题集合,附带超详细答案,希望能帮助到大家。
评论