首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏蝉沐风的码场

    为什么MySQL的主键查询这么快

    3.4 数据页中主键的高效查询方案到目前为止,我们已经知道了在一个数据页中,用户记录是按照主键由小到大的顺序串联而成的单向链表。接下来我们要解决的就是如何在一个数据页中根据主键值搜索数据了。 使用二分法,计算中间槽的位置,(0+3)/2=1,查看槽1对应的“组长”的主键值为4,因为4<7,所以设置low=1,high保持不变;再次使用二分法,计算中间槽的位置,(1+3)/2=2,查看槽2对应的 “组长”的主键值为8,因为8>7,所以设置high=2,low保持不变;现在high=2,low=1,两者相差1,已经没有必要继续进行二分了,可以确定我们的记录就在槽2中,并且我们也能知道槽2对应的“组长 上文提到过,我们可以通过槽2找到槽1,进而找到它的“组长”,然后沿着“组长”向下遍历直到找到主键为7的记录就可以了。说到这里,我们已经非常清楚在一个数据页中是如何根据主键进行搜索的。 但是对于我们这篇文章的主题——MySQL的主键查询为什么这么快,只能算是回答了一半,毕竟在数据页中进行搜索的前提是你得先找到数据页啊。这就是每次面试必问的MySQL索引的知识了,下一篇文章再介绍吧。

    4.5K92编辑于 2022-08-04
  • 来自专栏别先生

    Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加

    Hibernate的添加,修改,查询(三种查询方式)的方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略; 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.java :     6.3.1:主键查询的方法       两种方法:        User u=(User)session.get(User.class, 1);                User u sf.openSession(); 32 //3:开启事务 33 Transaction tx=session.beginTransaction(); 34 //4:主键查询 (User)session.load(User.class, 1); 37 38 //主键查询测试结果 39 System.out.println(u) ;       (2):HQL查询是Hibernate提供的面向对象的查询语句,查询的是对象以及对象的属性,区分大小写的。

    6.2K110发布于 2018-01-02
  • 来自专栏LongJava学习资料

    Mybatis模糊查询——三种定义参数方法和聚合查询主键回填

    持久层接口添加查询所有用户个数方法 2. UserMapper.xml添加标签 3. 添加测试方法 4. 运行结果 五、主键回填 1. 持久层接口添加新增用户方法 2. 持久层接口添加根据名字内容模糊查询方法 // 根据名字内容模糊查询 List<User> findByNameLike(String username); 2. 运行结果 四、聚合查询 1. 持久层接口添加查询所有用户个数方法 // 查询用户总数 int findCount(); 2. UserMapper.xml添加标签 <! 运行结果 还是比较可靠的,确实查询出来了用户总数  五、主键回填         有时我们需要获取新插入数据的主键值。 如果数据库中主键是自增的,这时我们就需要使用MyBatis的主键回填功能。 1. 持久层接口添加新增用户方法 // 主键回填-新增用户 void add2(User user); 2.

    75940编辑于 2023-03-26
  • 来自专栏LongJava学习资料

    _Mybatis模糊查询——三种定义参数方法和聚合查询主键回填

    持久层接口添加根据名字内容模糊查询方法// 根据名字内容模糊查询 List<User> findByNameLike(String username);2. 运行结果四、聚合查询1. 持久层接口添加查询所有用户个数方法// 查询用户总数 int findCount();2. UserMapper.xml添加标签<! 运行结果 还是比较可靠的,确实查询出来了用户总数  五、主键回填         有时我们需要获取新插入数据的主键值。如果数据库中主键是自增的,这时我们就需要使用MyBatis的主键回填功能。 持久层接口添加新增用户方法// 主键回填-新增用户 void add2(User user);2. UserMapper.xml添加标签<! -- 主键回填 --> <insert id="add<em>2</em>" parameterType="com.mybatisstudy.pojo.User"> <!

    55530编辑于 2023-11-21
  • 来自专栏IT码农

    Yii2 联表查询数据丢失,即出现主键覆盖情况的解决方法

    前段时间做项目,遇到一个问题,用yii2的AR连表查询数据的时候,理应该查出来更多的数据,但是实际得到的只有部分数据: 例如,有这么一个查询: $query = OperaHotelRoom::find 自己观察下数据,就发现,将sql查出来的数据group by ID(ID是表的主键)后就得到了上面的13条记录,即,应AR连表查询的时候,会出现主键覆盖情况. 解决方案: 在select的时候,将主键select出来,并且起个新的字段名称,再查,就会发现,所有的数据都有了 ?

    1.2K41发布于 2019-09-03
  • 来自专栏软件研发

    ClickHouse 主键索引的存储结构与查询性能优化

    作为一种列式存储数据库,ClickHouse采用了一些高效的数据结构来实现主键索引,并通过一系列优化技术来提升查询性能。本文将介绍ClickHouse主键索引的存储结构以及一些查询性能优化方法。1. 主键索引表的数据存储在内存中,为了提升查询性能,它被设计为高度压缩的形式。2. 查询性能优化方法2.1. 使用主键索引表ClickHouse在进行查询时,会根据查询条件首先在主键索引表中查找对应的主键位置信息。通过主键索引表的查找,可以快速定位数据所在的分区和块,避免了全表扫描的开销。2.2. 通过合理利用主键索引并结合其他优化方法,可以提高ClickHouse的查询性能,有效地处理大量数据。 total_amount ) VALUES ( '2021-01-01', 1, 'Product A', 10.99, 20, 219.80 ), ( '2021-01-01', 2,

    1.4K30编辑于 2023-11-13
  • 来自专栏JavaEdge

    MySQL聚簇索引物理结构及主键查询过程

    假设有多个数据页,然后根据主键查询数据,直接查询是不行的,因为不知道主键到底在哪 若你要查id=4的数据,你咋知它在哪个数据页嘞? 对此,就得针对主键设计个索引,针对主键的索引实际上就是主键目录:把每个数据页的页号,还有数据页里最小的主键值放在一起,组成一个索引的目录 有了上图的主键目录就好多了,直接到主键目录搜索id=3的数据, 此时就会和每个数据页的最小主键来比,首先id=3大于了数据页2里的最小主键值1,接着小于了数据页8里的最小主键值4。 于是就可定位到id=3的数据一定在数据页2。 假设有很多数据页,在主键目录里就会有很多数据页和最小主键值,此时完全可二分查找待查询id在哪个数据页。 所以这效率很高,类似上图的主键目录就能认为是主键索引。

    1.4K20编辑于 2022-02-20
  • 来自专栏蝉沐风的码场

    图解|12张图解释MySQL主键查询为什么这么快

    3.4 数据页中主键的高效查询方案 到目前为止,我们已经知道了在一个数据页中,用户记录是按照主键由小到大的顺序串联而成的单向链表。接下来我们要解决的就是如何在一个数据页中根据主键值搜索数据了。 现在我们再来看看在这个数据页中,我们查询id为7的记录,过程是怎样的。 使用二分法,计算中间槽的位置,(0+3)/2=1,查看槽1对应的“组长”的主键值为4,因为4<7,所以设置low=1,high保持不变; 再次使用二分法,计算中间槽的位置,(1+3)/2=2,查看槽2对应的 “组长”的主键值为8,因为8>7,所以设置high=2,low保持不变; 现在high=2,low=1,两者相差1,已经没有必要继续进行二分了,可以确定我们的记录就在槽2中,并且我们也能知道槽2对应的“ 但是对于我们这篇文章的主题——MySQL的主键查询为什么这么快,只能算是回答了一半,毕竟在数据页中进行搜索的前提是你得先找到数据页啊。这就是每次面试必问的MySQL索引的知识了,下一篇文章再介绍吧。

    1.1K10编辑于 2022-08-22
  • 来自专栏小简技术栈

    一个多功能(聚合)查询接口,实现模糊、分页、主键、排序以及多条件查询

    但是RESTful如果功能过多,对应的接口也会随之增多,比如后台的查询接口和前台可能数据有区别需要额外写一个,可能前台查询数据某一个要模糊查询,某一个又要走主键查询,有的又是多条件查询。 :queryWrapper.orderByXXX() 至于主键查询,我预想是创建一个注解作为标识,如果在逻辑处理时候发现主键标识注解的字段值不为空,我就直接抛弃所有其他条件,直接走主键查询,ById。 在排除主键(没时间写啦)查询的情况下,逻辑总结如下: 如果存在绝对查询条件情况,如:ID查询、手机号查询、邮箱查询,直接性查询,就不拼接模糊查询了。 * © JanYork 2023年6月2日 23点37分 */ /** *

    * 泛型说明: *

      *
    • T:直接性查询条件对象
    • MP日志: Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2e00c6c9

    1.6K90编辑于 2023-06-04
  • 来自专栏java学习java

    查询(2)

    相关子查询 相关子查询执行流程 如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为 关联子查询 相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。 employees e1,(SELECT department_id,AVG(salary) dept_avg_sal FROM employees GROUP BY department_id) e2 `department_id` = e2.department_id AND e2.dept_avg_sal < e1. FROM employees e1 WHERE EXISTS ( SELECT * FROM employees e2 WHERE e2.manager_id = e1.employee_id); 子查询实际上是通过未知表进行查询后的条件判断

    1.3K20编辑于 2022-11-13
  • 来自专栏后端技术学习

    基于Saas主键表生成主键id

    1.主键生成策略方式 ? 主键生成策略 2.基于Saas主键表生成主键id流程 由于我们的系统时基于Saas的,因此生成主键时,需要以租户id(TenantId)为基础进行生成。 为了生成的id符合我们的租户的要求,通常都会现将租户表建好,然后基于租户表中的租户id进行主键id的生成。此时便产生基于租户id生成主键,那么怎样生成主键id呢?可以查看下图: ? (* com.xtt..*.dao.mapper..*.insert*(..))") public void primaryKeyRule() {} 也就是说在进行主键的生成时,我们拦截好需要生成的主键 拿到租户id后,就可以进行主键id获取了。 private void setPrimaryKey(Object entity, Class<? return current; } 从而实现主键自增的目的,从而实现基于租户id进行自增的策略。

    2.3K20发布于 2021-06-24
  • 来自专栏全栈程序员必看

    oracle 主键删除,联合主键的创建

    1,主键的删除 ALTER TABLE TABLENAME DROP PRIMARY_KEY 运行上面的SQL能够删除主键;假设不成功能够用 ALTER TABLE TABLENAME DROP CONSTRAINTS COLUMN CASCADE; –删除约束 ALTER TABLE TABLENAME DISABLE PRIMARY_COLUMN ; –设置被设置为主键的列为无效 DROP INDEX INDEX_NAME; –删除主键索引 2,查看主键约束 SELECT * FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE =’P’ AND TABLE_NAME=’你要查看的表名’ AND OWNER=USER 3,创建联合主键 ALTER TABLE ADD CONSTRAINTS ‘约束名’ PRIMARY

    4.4K10编辑于 2022-07-13
  • 来自专栏爱可生开源社区

    MySQL 核心模块揭秘 | 35 期 | 主键索引等值查询加什么锁?

    创建测试表: CREATE TABLE `t4` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `i1` int DEFAULT '0', `i2` `uniq_i1` (`i1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; 插入测试数据: INSERT INTO `t4` (`id`, `i1`, `i2` ) VALUES (1, 11, 21), (2, 12, 22), (3, 13, 23), (4, 14, 24), (5, 15, 25), (6, 16, 26); 2. 示例 SQL 的 where 条件中只包含主键索引字段,主键索引的唯一约束能够保证:只要不删除表中 <id = 10> 的记录,就不会再有其它 <id = 10> 的记录插入到主键索引中。 总结 可重复读、读已提交两种隔离级别下,对主键索引字段进行等值查询,虽然都对记录加了共享普通记录锁,但是它们的加锁逻辑是不一样的。 这两种隔离级别下,对唯一索引进行等值查询,加锁情况是什么样的呢?

    40810编辑于 2024-09-25
  • 来自专栏全栈程序员必看

    mysql 联合主键_Mysql 创建联合主键

    例子代码如下: CREATE TABLE `book_sort2` ( `sort_id2` varchar(20) NOT NULL, `sort_id1` varchar(20) NOT NULL unionkeyname primary key (column1,column2); 上面语句中: tablename … mysql创建,添加主键 primary key 1.最简单的 : CREATE TABLE t1( id int not null, name char(20)); 2.带主键的: a:CREATE TABLE t1( id … MySQL创建双主键 如下: CREATE DROP C … Oracle 主键、联合主键查询与创建 –查询某个表是否有唯一主键 select cu.* from user_cons_columns cu, user_constraints 联合索引 我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升

    10.7K20编辑于 2022-07-04
  • 来自专栏爱可生开源社区

    MySQL 核心模块揭秘 | 37 期 | 主键索引范围查询加什么锁?

    utf8mb3; 插入测试数据: INSERT INTO `t1` (`id`, `i1`) VALUES (10, 101), (20, 201), (30, 301), (40, 401); 2. REC_NOT_GAP lock_status | GRANTED lock_data | 10 ***************************[ 2. REC_NOT_GAP lock_status | GRANTED lock_data | 10 ***************************[ 2. 可重复读隔离级别对主键索引中 <id = 30> 的记录加了锁,读已提交隔离级别为什么没有对主键索引中 <id = 30> 的记录加锁呢? 我们最终看到的结果就是示例 SQL 没有对主键索引中 <id = 30> 的记录加锁。

    50110编辑于 2024-10-21
  • 来自专栏更流畅、简洁的软件开发方式

    细分主键

      主键本身是很简单的,但是围绕他产生的故事就不是那么简单了。 1、 管理 这个是最重要的,没有规矩不成方圆,主键要如何管理一定要实现确定好了,甚至有必要为此写一个规范。 比如是全公司采用相同的方式处理主键,还是根据项目、产品来各自管理?还是由项目组成员自行决定?这些都是需要实现说清楚的。 2、 定义 不是说“主键”这个词的定义,而是主键用什么,比如用GUID还是用int,还是年月日时分秒+流水? 3、 生成 主键用什么确定好了之后就是如何生成了。 4、 安全 1,2,3,4这种主键是否够安全?是不是因为不安全就不能用了?一定要改成GUID才行?那么改成GUID了,是否还需要进行安全判断?什么情况下可以用int,什么时候不能用(因为安全原因)? 7、 数据合并 几个分公司的数据需要合并到一起,主键是否会冲突(重复)? 说这些的目的就是想让大家讨论的时候更明确一些,虽然我们都在讨论主键,但是这个范围也是很大的。 欢迎大家继续补充。

    82560发布于 2018-02-26
  • 来自专栏全栈程序员必看

    mysql 主键自增语句_MySQL 自增主键

    自增主键有两个性质需要考虑: 单调性 每次插入一条数据,其 ID 都是比上一条插入的数据的 ID 大,就算上一条数据被删除。 自增主键的单调性 为何会有单调性的问题? 这主要跟自增主键最大值的获取方式,以及存放位置有关系。 如果最大值是通过计算获取的,并且在某些情况下需要重新获取时,会因为最新的数据被删除而减小。 自增主键最大值怎么取的?存放到哪里? 从 MySQL 8.0 开始,自增主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里的值。 不保证事务 A 的数据的 ID 连续: innodb_autoinc_lock_mode = 2 (mutex) 三种插入定义: 简单插入 能够提前知道插入的行数 批量插入 不能提前知道插入的行数 混合插入

    14.6K10编辑于 2022-07-18
  • 来自专栏行者常至

    Hibernate 主键介绍

    Hibernate有如下主键: ---- Native: Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式。 ---- Increment: Increment方式对主键值采取自动增长的方式生成新的主键值,但要求底层数据库支持Sequence方式,如Oracle、DB2等。 特点是与底层数据库有关,要求数据库支持Identity,如MySQL中是auto_increment,SQL Server 中是Identity,支持的数据库有MySQL、SQL Server、DB2、 特点是需要底层数据库支持序列,支持序列的数据库有DB2、PostgreSql 、Oracle、SAPDb 等在不同数据库之间移植程序,特别是从支持序列的数据库移植到不支持序列的数据库需要修改配置文件。 特点是需要额外的数据库表的支持,能保证同一个数据库中主键主键的唯一性,但不能保证多个数据库之间主键的唯一性。

    89420发布于 2018-08-10
  • 来自专栏ops技术分享

    Mysql资料 主键

    表中的任何列都可以作为主键,只要它满足以下条件: 1、任何两行都不具有相同的主键2、每个行都必须具有一个主键值(主键列不允许NULL值) 除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为 : 1、不更新主键列的值 2、不重用主键列的值 3、不在主键列中使用可能会更改的值(例如,如果使用一个名字作为主键以标识某个供应商,应该供应商合并和更改其名字时,必须更改这个主键) 总之:不应该使用一个具有意义的 KEY(id); ALTER TABLE s2 CHANGE id id int(11) NOT NULL AUTO_INCREMENT; 删除主键: ALTER TABLE s2 CHANGE id 如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并一次作为主键。 mysql 在频繁的更新、删除操作,会产生碎片。而含碎片比较大的表,查询效率会降低。 此时需对表进行优化,这样才会使查询变得更有效率。

    5.8K20发布于 2021-06-08
  • 主键自增】

    @Id 注解用于标识实体类中的主键字段,在数据库表中对应的是主键列。 @GeneratedValue注解用于定义主键生成策略,strategy属性指定了生成主键的方式,常用的取值有IDENTITY、SEQUENCE、TABLE等。 @Id注解是JPA规范中的注解,用于标记实体类的主键字段。 在MyBatis中,@TableId注解和@Id注解具有相同的功能,用于标记实体类的主键字段。 @Id注解在实体类的主键字段上进行标注,表示该字段为实体类的主键。 ,并使用了@GeneratedValue(strategy = GenerationType.IDENTITY)和@TableId注解的type属性设置了主键生成策略为数据库自增长主键

    34210编辑于 2025-08-29
领券