首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么MySQL主键查询这么快

能啊,这篇文章的题目就是关于主键啊,我们可以按照主键的顺序,从小到大来串联当前数据页中的所有记录。事实上,MySQL的设计者也确实是这么设计的。...如果你足够叛逆,你可能会想,你不设置主键的话是不是MySQL就崩了啊?...3.4 数据页中主键的高效查询方案到目前为止,我们已经知道了在一个数据页中,用户记录是按照主键由小到大的顺序串联而成的单向链表。接下来我们要解决的就是如何在一个数据页中根据主键值搜索数据了。...如果我们执行下面这条查询语句SELECT * FROM row_format_table WHERE id = 4;最简单的办法就是遍历当前页面的所有记录,从Infimum记录开始沿着单向链表进行搜索,...但是对于我们这篇文章的主题——MySQL主键查询为什么这么快,只能算是回答了一半,毕竟在数据页中进行搜索的前提是你得先找到数据页啊。这就是每次面试必问的MySQL索引的知识了,下一篇文章再介绍吧。

4.1K92

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

Mysql 创建联合主键 2008年01月11日 星期五 下午 5:21 使用primary key (fieldlist) 比如: create table mytable ( aa int, bb...char(8), cc date, primary key (aa,bb ) ); aa,bb为联合主键 不知道是不是因为mysql(6.0)的版本问题,还是各版本都是这种情况,mysql中创建联合主键...COMMENT ‘主键编号’, `IP` … mysql修改联合主键 参考 https://blog.csdn.net/BockSong/article/details/80933477 alter...DROP PRIMARY_KEY 运行上面的SQL能够删除主键:假设不成功能够用 ALTER TABLE TABLENAME DROP C … Oracle 主键、联合主键查询与创建 –查询某个表是否有唯一主键...联合索引 我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升

8.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    自增主键的单调性 为何会有单调性的问题? 这主要跟自增主键最大值的获取方式,以及存放位置有关系。 如果最大值是通过计算获取的,并且在某些情况下需要重新获取时,会因为最新的数据被删除而减小。...自增主键最大值怎么取的?存放到哪里?...MySQL 5.7 及之前的版本,自增主键最大值会在启动(重启)后从数据库中取出放到内存: SELECT MAX(ai_col) FROM table_name FOR UPDATE; 这样获取是通过计算的...从 MySQL 8.0 开始,自增主键最大值会在每次修改后写入到 redo log,并且在每个检查点写入引擎私有的系统表。 如果是正常重启,则读取系统表里的值。...参考文档 为什么 MySQL 的自增主键不单调也不连续 https://database.51cto.com/art/202004/614923.htm 《MySQL技术内幕——InnoDB存储引擎》

    10.8K10

    Mysql资料 主键

    表中的任何列都可以作为主键,只要它满足以下条件: 1、任何两行都不具有相同的主键值 2、每个行都必须具有一个主键值(主键列不允许NULL值) 除MySQL强制实施的规则外,应该坚持的几个普遍认为的最好习惯为...这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15...2、.如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置: 此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉...如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并一次作为主键mysql 在频繁的更新、删除操作,会产生碎片。而含碎片比较大的表,查询效率会降低。...此时需对表进行优化,这样才会使查询变得更有效率。

    3.8K20

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

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

    1.2K20

    MySQL 开启慢查询&所有操作记录日志

    在运营网站的过程中,可能会遇到网站突然变慢的问题,一般情况下和 MySQL 慢有关系,可以通过开启慢查询,找到影响效率的 SQL ,然后采取相应的措施。...下面介绍一下如何开启慢查询: 1、开启慢查询 找到 MySQL 的配置文件 ,my.cnf (Windows 为 my.ini ),在 [mysqld]下增加下面几行: long_query_time=...然后重新启动MySQL服务 注意,mysql 5.6版本,记录慢查询日志的配置方式有修改为: long_query_time=2 slow_query_log=1 slow_query_log_file...注:可通过mysql>show full processlist;来查看当前mysql的连接进程; 3、要记录所有操作日志,包括select 在my.ini或my.cnf配置文件,[mysqld]中增加...:log=文件名 例:log=/tmp/mysqlquery.log 重启mysqld,即会把所有相关操作日志都记录下来 注意:log记录的位置,mysql要有写权限; 注意,mysql 5.6版本,记录所有操作日志的配置方式有修改为

    3.4K20

    mysql主键自增策略_MySQL 自增主键机制

    自增主键:特指在自增列上定义的主键。 自增主键的优点是让主键索引保持递增顺序的插入,避免页分裂,索引更加紧凑。 1. 自增值保存在哪? 不同的存储引擎保存自增值的策略不一样; a....Innodb引擎,mysql5.7之前,自增值保存在内存中,而且不会持久化自增值。...每次重启后第一次打开表,都会去查找自增值的最大值max(id), 并设置表当前自增值为max(id) + 1; mysql8.0, 自增值变更记录在了redo log中,重启时依靠redo log恢复重启之前的值...为了减少自增id锁带来的性能影响,mysql不会修改回去之前的自增值; 4. 自增锁的优化 a....而对于批量插入数据的语句(select … insert,replace … select 和 load data 语句),MySQL 有一个批量申请自增 id 的策略(注:该策略是导致自增 id 不连续的第三种原因

    9.4K50

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

    能啊,这篇文章的题目就是关于主键啊,我们可以按照主键的顺序,从小到大来串联当前数据页中的所有记录。事实上,MySQL的设计者也确实是这么设计的。...如果你足够叛逆,你可能会想,你不设置主键的话是不是MySQL就崩了啊?...3.4 数据页中主键的高效查询方案 到目前为止,我们已经知道了在一个数据页中,用户记录是按照主键由小到大的顺序串联而成的单向链表。接下来我们要解决的就是如何在一个数据页中根据主键值搜索数据了。...如果我们执行下面这条查询语句 SELECT * FROM row_format_table WHERE id = 4; 最简单的办法就是遍历当前页面的所有记录,从Infimum记录开始沿着单向链表进行搜索...但是对于我们这篇文章的主题——MySQL主键查询为什么这么快,只能算是回答了一半,毕竟在数据页中进行搜索的前提是你得先找到数据页啊。这就是每次面试必问的MySQL索引的知识了,下一篇文章再介绍吧。

    81010

    MySQL主键设计盘点

    主键设计和应用原则 除了满足MySQL强制实施的规则(主键不可重复;一行中主键不可为空)之外,主键的设计和应用应当还遵守以下公认的原则: 不更新主键列中的值; 不重用主键列的值; 不在主键列中使用可能会更改的值...3、ID作为主键时在特定的环境会存在一些问题,比如需要排序的时候——UUID是无序的。 4、MySQL官方有明确的建议主键要尽量越短越好,36个字符长度的UUID不符合要求。...5、对MySQL索引不利:作为数据库主键,在InnoDB引擎下,UUID的无序性可能会引起数据位置频繁变动,严重影响性能。...关于MySQL 使用自增ID主键和UUID 作为主键的性能比较可以查看参考【8】。 结论: 1、uuid做主键适用于小规模分布式架构用。...结论: 用自建的id生成器做主键适用于大规模分布式架构 参考: 【1】:红心李 :MySQL主键设计 【2】:Uncle Nucky :MySQL数据库主键设计原则 【3】:ellis:设计套路:Mysql

    4.2K30

    MySQL主键详解

    表中的任何列都可以作为主键,只要它满足以下主键值规则条件: 任两行不具相同的主键值 每行都必须具有一个主键值(主键列不允许NULL) 这里的规则是MySQL本身强制实施的。...除MySQL强制实施的规则外,还应该坚持的最佳实践: 不更新主键列中的值 不重用主键列的值 不在主键列中使用可能会更改的值 例如,如果使用一个名字作为主键以标识某个供应商,当该供应商合并和更改其 名字时...,必须更改这个主键) 联合主键 好处 可以直观的看到某个重复字段的记录条数 主键A跟主键B组成联合主键 主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。...此时上述的条件必须应用到构成主键所有列,所有列值的组合必须是唯一的(多列中的单个列的值可以不唯一)。...表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键 将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样

    4.9K20

    MySQL主键约束使用

    MySQL主键约束是一种用于确保表中每行数据的唯一性的限制。每个表只能有一个主键,它可以是一个或多个列。创建表时添加主键约束在创建表时添加主键约束,需要在列名后面添加关键字"PRIMARY KEY"。...主键约束和自增列通常情况下,主键约束通常与自增列一起使用。自增列是指在插入新行时,自动为该行分配一个唯一的值。在MySQL中,可以使用AUTO_INCREMENT关键字来创建自增列。...这意味着在插入数据时,无需提供"id"列的值,MySQL会自动为其分配一个唯一的值。示例假设有一个用户表,其中包含以下列:id、name和email。...如果要更新的行不止一行,所有行都将被更新。在此示例中,只有一行符合WHERE条件,因此只有一行被更新。如果要删除用户,可以使用DELETE语句。...如果没有WHERE子句,则将删除表中的所有行。

    2.6K20

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

    本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 正文 1....lock_status | GRANTED lock_data | 10 lock_data = 10, lock_mode = S,REC_NOT_GAP 表示对主键索引中...示例 SQL 的 where 条件中只包含主键索引字段,主键索引的唯一约束能够保证:只要不删除表中 的记录,就不会再有其它 的记录插入到主键索引中。...示例 SQL 执行过程中,对主键索引中 的记录加共享普通记录锁,属于默认情况,不需要其它解释了。 4....总结 可重复读、读已提交两种隔离级别下,对主键索引字段进行等值查询,虽然都对记录加了共享普通记录锁,但是它们的加锁逻辑是不一样的。 这两种隔离级别下,对唯一索引进行等值查询,加锁情况是什么样的呢?

    10010

    Mysql:小主键,大问题

    本篇讲解 Mysql 的「主键」问题,从「为什么」的角度来了解 Mysql 主键相关的知识,并拓展到主键的生成方案问题。再也不怕被问到 Mysql 时只知道 CRUD 了。...如果通过二级索引查询数据,流程如图上所示,先从二级索引树上搜索到「主键」,然后在聚簇索引上通过主键搜索到数据行。其中二级索引的叶子节点是直接存储的主键值,而不是主键指针。...业务 Key 的优点 Key 具有业务意义,在查询时可以直接作为搜索关键字使用 不需要额外的列和索引空间 可以减少一些 join 操作。...生成方案比较难 逻辑 Key 的优点 不会因为业务的变动而需要修改 Key 逻辑 操作简单,且易于管理 逻辑 Key 往往更小,性能更优 逻辑 Key 更容易保证唯一性 更易于优化 逻辑 Key 缺点 查询主键列和主键索引需要额外的磁盘空间...一般情况下,我们都使用 Mysql 的自增 ID,来作为表的「主键」,这样简单,而且从上面讲到的来看,性能也是最好的。

    3.8K10

    大战MySQL主键及其操作

    简忆上次所学知识:MySQL的记录长度为65535个字节,而varchar是达不到它的理论长度的,NULL占用一个字节,text文本不占用记录长度,因为它本身就占据十个字节。...这里继续学习与MySQL列属性相关知识:关于主键的增,改,删。...主键 主键:primary key (一张表中最多只能有一个主键主键,简而言之为主要的键,一张表中只能有一个字段可以使用对应的键,用来约束该字段里面的数据,不能重复,被称之为主键 。...运行结果:PRI代表主键(大部分时候),NULL为no,即主键本身不为空 二.创建表的时候,在字段之后,可以使用primary key(主键字段列表)来创建(如果有多个字段作为主键,可以称之为复合主键...删除主键 因为主键无法更新:所以只能先删除,再增加。

    4.4K20

    一条命令查询所有mysql用户的授权信息

    需求除了导数据外, 有时候还要导出用户授权信息.而官方的show grants 命令一次只能查询一个用户SHOW GRANTS [FOR user]常用的做法就是写脚本, 但这么个小事情还专门写脚本就太麻烦了...实现我们可以通过如下SQL得到查询所有用户授权信息的SQLselect concat('show grants for "',user,'"@"',host,'";') from mysql.user;...;""" | mysql -h127.0.0.1 -P3308 -p123456 -NB | mysql -h127.0.0.1 -P3308 -p123456 -NB图片这样便得到了所有用户的授权信息...再小小的优化一下MYSQL_CONN="mysql -h127.0.0.1 -P3308 -p123456 -NB"echo """select concat('show grants for \"',...user,'\"@\"',host,'\";') from mysql.user;""" | $MYSQL_CONN|$MYSQL_CONN图片这样便好看多了.以后有导出授权DDL的时候就可以跑这个命令了

    50830
    领券