Java 业务开发常见错误 100 例
朱晔
贝壳金服资深架构师
52944 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
代码篇 (23讲)
Java 业务开发常见错误 100 例
15
15
1.0x
00:00/00:00
登录|注册

答疑篇:代码篇思考题集锦(二)

数据库与框架
Java编程
数据库索引
思考题集锦

该思维导图由 AI 生成,仅供参考

你好,我是朱晔。
今天,我们继续一起分析这门课第 7~12 讲的课后思考题。这些题目涉及了数据库索引、判等问题、数值计算、集合类、空值处理和异常处理的 12 道问题。
接下来,我们就一一具体分析吧。

07 | 数据库索引:索引并不是万能药

问题 1:在介绍二级索引代价时,我们通过 EXPLAIN 命令看到了索引覆盖和回表的两种情况。你能用 optimizer trace 来分析一下这两种情况的成本差异吗?
答:如下代码所示,打开 optimizer_trace 后,再执行 SQL 就可以查询 information_schema.OPTIMIZER_TRACE 表查看执行计划了,最后可以关闭 optimizer_trace 功能:
SET optimizer_trace="enabled=on";
SELECT * FROM person WHERE NAME >'name84059' AND create_time>'2020-01-24 05:00:00';
SELECT * FROM information_schema.OPTIMIZER_TRACE;
SET optimizer_trace="enabled=off";
假设我们为表 person 的 NAME 和 SCORE 列建了联合索引,那么下面第二条语句应该可以走索引覆盖,而第一条语句需要回表:
explain select * from person where NAME='name1';
explain select NAME,SCORE from person where NAME='name1';
通过观察 OPTIMIZER_TRACE 的输出可以看到,索引覆盖(index_only=true)的成本是 1.21 而回表查询(index_only=false)的是 2.21,也就是索引覆盖节省了回表的成本 1。
索引覆盖:
analyzing_range_alternatives": {
"range_scan_alternatives": [
{
"index": "name_score",
"ranges": [
"name1 <= name <= name1"
] /* ranges */,
"index_dives_for_eq_ranges": true,
"rowid_ordered": false,
"using_mrr": false,
"index_only": true,
"rows": 1,
"cost": 1.21,
"chosen": true
}
]
回表:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

这篇技术文章涵盖了数据库索引、空值处理、异常处理等多个方面的技术问题。其中包括了对数据库索引的优化和成本分析,Java中对象判断、集合类的contains方法区别,以及浮点数和整型数字在MySQL中的定义和浮点数准确计算的实现方法。此外,还介绍了在使用ArrayList的remove方法时可能遇到的ConcurrentModificationException异常,以及如何通过迭代器的remove方法或removeIf方法来解决这个问题。另外,还讨论了ConcurrentHashMap和HashMap对null值的处理差异,以及在MyBatis框架中如何实现类似Hibernate的动态SQL功能。此外,还涉及了在finally代码块中抛出异常的问题,以及手动抛出异常时建议使用JDK中的标准异常的原因和适用场景。整体而言,这篇文章内容丰富,涉及了多个技术领域,适合技术人员快速了解和学习。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 业务开发常见错误 100 例》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 镞砺括羽
    我有个问题想问 where 1=1 是不是换成<where>更好一些
    2022-05-11
    1
    2
  • fusion
    老师为什么我查询的结果是 SET SQL_SELECT_LIMIT=1000 { "steps": [ ] } 0 false 语句是: SET optimizer_trace="enabled=on"; SELECT name,score FROM person WHERE NAME='name1' SELECT * FROM information_schema.OPTIMIZER_TRACE; SET optimizer_trace="enabled=off";
    2024-01-17归属地:福建
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部