Java学习笔记(十二)
Mysql explain Extra
MySQL的EXPLAIN语句是优化数据库查询的重要手段,其中的Extra列包含了不适合在其他列中显示但十分重要的额外信息。以下是对Extra列的详细介绍及举例:
一、Using filesort
-
解释:表示MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”。
-
示例:
- 假设有一个表test,其中建立了(col1, col2, col3)三个字段的复合索引。如果查询时排序没有按照(col1, col2, col3)的顺序进行,就会产生外部的索引排序,即Using filesort,此时查询效率较低。
- 反之,如果排序时按照(col1, col2, col3)的顺序进行,则不会使用外部的索引排序,查询效率较高。
二、Using temporary
-
解释:表示MySQL在对查询结果排序或分组查询时使用了临时表保存中间结果。
-
示例:
- 假设有一个表test,其中建立了(col1, col2)两个字段的复合索引。如果查询时分组没有按照(col1, col2)的顺序进行,就会产生临时表和外部的索引排序,即Using temporary和Using filesort。
- 反之,如果分组时按照(col1, col2)的顺序进行,则不会产生临时表,也不会使用外部的索引排序,查询效率较高。
三、Using index
-
解释:表示相应的SELECT操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率较高。覆盖索引是指SELECT的数据列只用从索引中就能够取得,不必读取数据行。
-
示例:
- 假设有一个表test_users,其中建立了(user_name, age)的复合索引。如果查询时SELECT的字段是user_name和age,且WHERE子句中的条件能够使用该复合索引,则Extra列会显示Using index,表示查询只使用了索引而没有访问表的数据行。
四、Using where
-
解释:表示查询中使用了WHERE子句进行过滤。
-
示例:
- 假设有一个表test,查询语句为SELECT * FROM test WHERE age > 18。此时Extra列会显示Using where,表示查询中使用了WHERE子句对age字段进行过滤。
五、Using join buffer
-
解释:表示使用了连接缓存。这通常发生在连接操作(如JOIN)中,当驱动表(被连接的表,如LEFT JOIN左边的表或INNER JOIN中数据少的表)没有索引时,MySQL可能会使用连接缓存来提高查询效率。
-
示例:
- 假设有两个表table1和table2,其中table1是驱动表且没有索引。查询语句为SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id。此时如果Extra列显示Using join buffer,表示MySQL使用了连接缓存来提高查询效率。
六、Impossible where
-
解释:表示WHERE子句的值总是false,不能用来获取任何元组。
-
示例:
- 假设有一个表test,查询语句为SELECT * FROM test WHERE 1=0。此时Extra列会显示Impossible where,表示WHERE子句的条件永远不满足,无法获取任何数据。
七、Select tables optimized away
-
解释:表示在没有GROUP BY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作。这些优化可以在查询执行计划生成的阶段即完成,而不必等到执行阶段再进行计算。
-
示例:
- 假设有一个使用MyISAM存储引擎的表test,查询语句为SELECT COUNT() FROM test WHERE age > 18。如果age字段上有索引,且查询执行计划显示Select tables optimized away,则表示MySQL在查询执行计划生成的阶段就完成了COUNT()操作的优化。
八、Distinct
-
解释:表示优化DISTINCT操作。在找到第一匹配的元组后即停止找同样值的动作,以提高查询效率。
-
示例:
- 假设有一个表test,查询语句为SELECT DISTINCT age FROM test。如果Extra列显示Distinct,则表示MySQL在查询时优化了DISTINCT操作,只返回不重复的age值。
综上所述,MySQL EXPLAIN语句中的Extra列提供了关于查询执行计划的额外信息,有助于优化数据库查询。在实际应用中,可以根据Extra列的信息调整索引、查询语句等以提高查询效率。
Mysql explain key_len
在MySQL中,EXPLAIN
语句是用来分析SQL查询的性能的。当你对一个查询使用EXPLAIN
时,它会返回查询的执行计划,其中包含了诸如表的访问方式、使用的索引、扫描的行数等详细信息。在EXPLAIN
的输出中,key_len
是一个关键的列,它提供了关于MySQL在查询中使用的索引键长度的信息。
key_len 列的详细说明
key_len
表示MySQL在查询中使用的索引键的总长度(以字节为单位)。这个长度是根据索引中的列的数据类型和长度来计算的。
如何计算 key_len
-
单列索引:
- 对于字符串类型(如
CHAR
,VARCHAR
),key_len
等于字符集的最大字节长度乘以列定义的字符数。例如,VARCHAR(255) CHARACTER SET utf8
的key_len
将是255 * 3 = 765
字节(因为utf8
字符集最多使用3个字节)。 - 对于数值类型(如
INT
,BIGINT
),key_len
等于数据类型的大小。例如,INT
类型的key_len
是4字节,BIGINT
是8字节。
- 对于字符串类型(如
-
多列索引:
- 当使用多列索引时,
key_len
是所有索引列长度的总和。
- 当使用多列索引时,
示例
假设有一个表users
,定义如下:
CREATE TABLE users (id INT NOT NULL AUTO_INCREMENT,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL,PRIMARY KEY (id),INDEX idx_username_email (username, email)
);
- 如果查询是
SELECT * FROM users WHERE username = 'john';
,并且MySQL决定使用idx_username_email
索引,key_len
将是username
列的长度。假设username
列使用的是utf8
字符集,那么key_len
将是50 * 3 = 150
字节。 - 如果查询是
SELECT * FROM users WHERE username = 'john' AND email = 'john@example.com';
,并且MySQL决定使用idx_username_email
索引,key_len
将是username
和email
两列的长度之和。假设email
列也使用utf8
字符集,那么key_len
将是50 * 3 + 100 * 3 = 450
字节。
使用 key_len 的注意事项
key_len
可以帮助你理解MySQL是如何使用索引的,以及索引是否有效地减少了需要扫描的数据量。- 如果
key_len
比预期的要小,可能是因为查询条件中只使用了索引的一部分列,或者是因为索引列有前缀索引(即只索引了列的前缀部分)。 - 在设计索引和查询优化时,
key_len
是一个重要的参考指标,但也要结合其他EXPLAIN
输出信息(如type
,rows
,Extra
等)来综合分析。
通过理解key_len
的含义和计算方法,你可以更有效地使用MySQL的索引功能,从而优化查询性能。
为了统计一个List<String>
中每种字符串的数量,并且将这些数量按顺序存储到一个List<Integer>
中,你可以采用以下步骤:
- 遍历输入的字符串列表。
- 使用一个
HashMap
来记录每种字符串的出现次数。 - 遍历完列表后,根据输入列表中的字符串顺序,从
HashMap
中提取对应的数量。 - 将这些数量存储到一个新的
List<Integer>
中。
以下是Java代码示例:
import java.util.*;public class StringCounter {public static void main(String[] args) {List<String> input = Arrays.asList("a", "a", "b", "ck", "ck");List<Integer> counts = countStrings(input);System.out.println(counts); // 输出: [2, 1, 2]}public static List<Integer> countStrings(List<String> input) {Map<String, Integer> countMap = new HashMap<>();List<Integer> result = new ArrayList<>();// 统计每种字符串的数量for (String str : input) {countMap.put(str, countMap.getOrDefault(str, 0) + 1);}// 按照输入列表的顺序获取数量for (String str : input) {result.add(countMap.get(str));}return result;}
}
在这段代码中:
countStrings
方法接收一个List<String>
作为输入,并返回一个List<Integer>
。- 使用
HashMap<String, Integer>
来存储每种字符串及其对应的数量。 getOrDefault
方法用于在HashMap
中查找字符串的数量,如果字符串不存在,则返回默认值0,并随后加1。- 第二个for循环遍历输入列表,并使用
countMap
来获取每种字符串的数量,然后将这些数量添加到结果列表中。
这种方法的时间复杂度是O(n),其中n是输入列表的长度,因为我们需要遍历列表两次:一次用于统计数量,一次用于构建结果列表。空间复杂度也是O(n),因为在最坏的情况下,HashMap
中可能需要存储n个不同的字符串及其数量。然而,在实际应用中,由于可能存在重复的字符串,所以HashMap
的大小通常远小于n。
Java 一个线程对象调用start方法实现多线程执行的原理
在 Java 中,当一个线程对象调用 start()
方法时,会触发一系列的操作来实现多线程的执行。以下是这一过程的详细原理:
-
创建线程对象:
首先,你通过创建一个Thread
类的实例(或者一个继承自Thread
类的子类实例)来定义一个线程对象。在这个线程对象中,你需要重写run()
方法,该方法包含了线程要执行的任务代码。 -
调用
start()
方法:
当你调用线程对象的start()
方法时,这个方法并不会直接执行run()
方法中的代码。相反,它会做几件事情:- 检查线程状态:首先,
start()
方法会检查线程的状态。如果线程已经启动过了(即它的状态不是NEW
),那么start()
方法会抛出一个IllegalThreadStateException
异常。 - 设置线程状态:如果线程状态是
NEW
,start()
方法会将线程的状态设置为RUNNABLE
(或更准确地说是READY
,因为线程可能还需要等待 CPU 时间片)。 - 调用本地方法:
start()
方法最终会调用一个本地方法(native method),这个本地方法会请求操作系统的线程调度器创建一个新的本地线程(native thread)。这个本地线程会被分配给一定的 CPU 时间片,以便执行。
- 检查线程状态:首先,
-
线程调度和执行:
一旦操作系统创建了本地线程,这个线程就会开始执行。但是,它并不会直接执行 Java 线程对象的run()
方法。相反,它会执行 JVM 提供的一段启动代码(这段代码是 JVM 的一部分,而不是 Java 代码)。这段启动代码会负责:- 在 JVM 内部维护一个对 Java 线程对象的引用。
- 调用 Java 线程对象的
run()
方法。
因此,当你看到 Java 线程对象的
run()
方法被执行时,实际上是在一个新的本地线程中,由 JVM 的启动代码间接调用的。 -
线程终止:
当run()
方法执行完毕,或者线程因为某种原因(如抛出未捕获的异常)而终止时,本地线程也会相应地终止。JVM 会清理与这个线程相关的资源,并将其状态设置为TERMINATED
。
需要注意的是,直接调用 Java 线程对象的 run()
方法并不会启动一个新的线程。相反,它只会在当前线程中同步地执行 run()
方法中的代码。要启动一个新的线程,必须调用 start()
方法。
总结来说,Java 中一个线程对象调用 start()
方法实现多线程执行的原理涉及到线程状态的改变、本地线程的创建、JVM 启动代码的调用以及线程调度和执行等多个方面。
相关文章:
Java学习笔记(十二)
Mysql explain Extra MySQL的EXPLAIN语句是优化数据库查询的重要手段,其中的Extra列包含了不适合在其他列中显示但十分重要的额外信息。以下是对Extra列的详细介绍及举例: 一、Using filesort 解释:表示MySQL会对数据使用一个外部的索引排序…...
《Java 实现希尔排序:原理剖析与代码详解》
目录 一、引言 二、希尔排序原理 三、代码分析 1. 代码整体结构 2. main方法 3. sort方法(希尔排序核心逻辑) 四、测试结果 一、引言 在排序算法的大家族中,希尔排序是一种改进的插入排序算法,它通过将原始数据分成多个子序…...

RDMA驱动学习(二)- command queue
为了实现用户对网卡硬件的配置,查询,或者执行比如create_cq等命令,mellanox网卡提供了command queue mailbox的机制,本节将以create_cq为例看下这个过程。 command queue(后续简称cmdq)是一个4K对齐的长度…...
H2 Database IDEA 源码 DEBUG 环境搭建
H2 Database IDEA 源码 DEBUG 环境搭建 基于最新的 version-2.3.230 拉取分支。 git remote add h2 https://github.com/h2database/h2database.git git fetch h2 git checkout -b version-2.3.230 version-2.3.230使用 # 启动 java -jar h2*.jar# H2 shell 方式使用 java …...
nginx系列--(三)--http
本文主要介绍http模块accept read流程,!!!请求对应的响应直接在read流程里就会返回给用户,而不需要通过write事件,和redis一样,基本都不通过eventloop write事件来发送响应给客户端,…...

通过Wireshark抓包分析,体验HTTP请求的一次完整交互过程
目录 一、关于Wireshark 1.1、 什么是Wireshark 1.2、下载及安装 二、HTTP介绍 2.1、HTTP请求过程介绍 2.2 、TCP协议基础知识 2.2.1、概念介绍 2.2.2、TCP协议的工作原理 2.2.3、三次握手建立连接 2.3.4、四次挥手断开连接 2.3、Wireshark抓包分析过程 2.3.1、三次握…...

Requestium:Python中的Web自动化新贵
文章目录 Requestium:Python中的Web自动化新贵背景:为何选择Requestium?Requestium是什么?如何安装Requestium?简单的库函数使用方法场景应用常见Bug及解决方案总结 Requestium:Python中的Web自动化新贵 背…...

2024版红娘金媒10.3婚恋相亲系统源码小程序(亲测)
1. 红娘服务 红娘服务模块是该系统的一大特色。专业红娘会通过分析用户的个人资料和偏好, 为用户提供精准的配对建议和个性化服务。用户可以预约红娘服务,通过红娘的介入,提升配对成功率。 2. 相亲活动 相亲活动模块用于组织和管理线下或线…...
k8s-实战——ES集群部署
文章目录 yaml文件es-pvc.yamles-svc.yamles-cluster-sts.yaml创建elasticsearch集群yaml文件 es-pvc.yaml 通过nfs服务进行新增pv并通过labels关联pvc前置准备需要提前准备pv的服务器以及挂在路径--- apiVersion: v1 kind: PersistentVolume metadata:name: nfs-es-pv-data-...

无人机的就业前景怎么样?
无人机的就业前景在当前及未来一段时间内都非常广阔。随着低空经济的蓬勃发展,无人机在农业、公安、测绘、交通、应急救援、影视拍摄等多个领域得到了广泛应用,对无人机操控员和相关专业人才的需求也随之急剧增加。 一、无人机操控员的就业前景 1. 高需…...

【学习】软件测试中V模型、W模型、螺旋模型三者介绍
在软件工程的星辰大海之中,存在着三种独特的航路图:V模型、W模型以及螺旋模型。它们分别以各自的方式描绘了软件开发与测试的不同旅程。 首先映入眼帘的是V模型——一个以垂直线条贯穿始终的简洁图形。这个模型如同一座倒立的“V”字形山峰,…...

Kafka存储机制大揭秘:从日志结构到清理策略的全面解析
文章目录 一、前言二、日志存储结构1.日志文件结构2.topic3.partition4.segment索引文件5.message结构6.message查找过程 三、存储策略1.顺序写2.页缓存3.零拷贝4.缓存机制 四、日志格式演变1.V0 版本2.V1 版本3.V0/V1消息集合4.V2 版本消息格式5.V2版本消息集合 五、偏移量维护…...
显卡服务器和普通服务器之间的区别有哪些?
显卡服务器也被称之为GPU服务器,显卡服务器与普通的服务器之间有着很明显的区别,下面就让我们共同来了解一下吧! 普通服务器的主要处理器通常都是配备的中央处理器,可以用于执行大部分通用计算任务和操作系统的管理;而…...

国产科技里程碑:自主算力走向世界,“表格编程”横空出世
近日,中国高科技领域迎来里程碑式的进展。 据安徽省量子计算工程研究中心官方消息,本源量子计算科技(合肥)股份有限公司(简称“本源量子”)成功向海外销售了其第三代自主超导量子计算机“本源悟空”的机时。…...
人工智能如何改变未来生活:从医疗到日常的全面升级
人工智能如何改变未来生活:从医疗到日常的全面升级 随着人工智能(AI)技术的进步,我们正逐渐看到它为各行各业带来的巨大变革。从医疗、企业到日常生活,AI通过简化流程、提高效率,甚至改善生活质量…...

第112届全国糖酒会(3月成都)正式官宣!
作为食品饮料行业内备受瞩目的年度盛事,全国糖酒商品交易会(简称“糖酒会”)一直是各大厂商与经销商展现企业风采、寻觅合作伙伴及签署订单的关键舞台。2024年10月31日,第111届全国糖酒商品交易会(秋糖)在深…...

NFT Insider #154:The Sandbox Alpha 4 第四周开启,NBA Topshot NFT 销量激增至新高
市场数据 加密艺术及收藏品新闻 NBA 赛季开幕推动 Topshot NFT 销量激增至新高 随着波士顿凯尔特人队和纽约尼克斯队在 10 月 22 日开启 2024-2025 NBA 赛季的序幕,NBA Topshot 的 NFT 销售量达到了自上赛季季后赛以来的最高水平。截止到 10 月 27 日的这一周&…...

【Canal 中间件】Canal 实现 MySQL 增量数据的异步缓存更新
文章目录 一、安装 MySQL1.1 启动 mysql 服务器1.2 开启 Binlog 写入功能1.2.1创建 binlog 配置文件1.2.2 修改配置文件权限1.2.3 挂载配置文件1.2.4 检测 binlog 配置是否成功 1.3 创建账户并授权 二、安装 RocketMQ2.1 创建容器共享网络2.2 启动 NameServer2.3 启动 Broker2.…...

独立开发的个人品牌打造:个人IP与独立开发的结合
引言 个人品牌程序员也需要打造。在当今的创意经济中,个人IP与独立开发的结合成为了一种趋势,为个体带来了前所未有的机会和可能性。本文将探讨如何通过打造个人IP来增强独立开发的影响力,并探索这种结合为个人带来的潜在价值。 个人IP的重…...
每天一题:洛谷P2002 消息扩散
题目背景 本场比赛第一题,给个简单的吧,这 100 分先拿着。 题目描述 有 n 个城市,中间有单向道路连接,消息会沿着道路扩散,现在给出 n 个城市及其之间的道路,问至少需要在几个城市发布消息才能让这所有 …...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...