mysql数据库主键设置了自增,但是,我把删除了一些数据,随后加的数据为什么会自增ID会接着已经删除了的?
这是因为你设置的主键自增策略中就是每次增二。其实在建表语句中主键字段设置autoincrement就可以了,当然建表以后也可以使用alte语句,实现自增一的效果。
mysql像这种语句,每个字段要加个备注,语句怎么写creat table (`id` int(11) NOT NULL auto_increment?
加`是为了使用mysql的保留字和关键字。比如要创建表select,但是select是关键字,系统不会让你创建,但加上`你就可以创建了,当然用的时候也要加上`的。
MySQL插入失败时可以不增加自增ID吗?
。。。把要涉及到插入的一系列操作全部放在事务里面。因为事务是原子性不可分割的,里面所有操作全部是一致的,并且失败的话会自动回滚的,不用担心什么ID自增这种情况了。话说小伙子啊,用MySQL不熟悉事务操作可不行啊,得赶紧补补课去😏😏😏
mysql事务id是连续的吗?
MySQL的事务ID不是连续的。每个事务都有一个唯一的ID,但这个ID不是连续的。每个新开始的事务都将获得一个新的、独特的ID。这使得事务在数据库中独立,有助于错误恢复和问题追踪。
MySQL查询select * from table where id in (几百或几千个id) ,如何提高效率?
看了下面各位的回答,有的说用exist,有的说用join,难道你们不是在把简单的事情复杂化了吗?竟然还有子表子查询一说?也有朋友说的很精准,不要用select *,这个*是个坑,实际开发过程中,关于MySQL开发规范也会明确告知大家不要select *。
首先我想问的是:查询MySQL的一张表怎么查最快?当然是根据主键查询了!
默认你的MySQL库、表引擎是Innodb引擎,然后会有一颗主键的B+树,叶子节点就是这个主键索引对应的数据,意味着一次查询即可,回表都不需要好不好?简单直接!
这就是MySQL在Innodb引擎下的聚集索引。
什么是聚集索引?
InnoDB聚集索引的叶子节点存储行记录,因此InnoDB必须要有且只有一个聚集索引。
1.如果表定义了PK(Primary Key,主键),那么PK就是聚集索引。
2.如果表没有定义PK,则第一个NOT NULL UNIQUE的列就是聚集索引。
3.否则InnoDB会另外创建一个隐藏的ROWID作为聚集索引。
这种机制使得基于PK的查询速度非常快,因为直接定位的行记录。
下图是利用普通索引做查询时候的一个回表操作,如何避免回表操作?使用覆盖索引!即select xxx,yyy from table where xxx='' and yyy='',只能查询xxx,yyy就会避免回表操作!
所以你还搞什么其他各种操作来秀呢?只不过题主说了id不是连续的,所以做不到范围查询,也就无法between查询了。
不要纯粹的依赖数据库
如果这个查询量级很大,并发很高,原则上我们是不允许直接查库的,中间必须有一层缓存,比如Redis。那至于这个数据怎么存储到redis就要看具体业务具体分析了。
如果内存足够,甚至可以把这几十万的数据直接放到redis里面去,然后通过redis 的管道查询一次给批量查询出来。
如果没必要存储这么多,或者不让存这么多,是不是可以采用redis的淘汰策略来控制缓存里的数据都是热点数据?
select a.* from tableA a
inner join (select id from tableB)b on a. id=b. id
创建临时表tableB并建主键索引,
或者构建inner join的只包括id字段的虚拟表b。
mysql8.0版本中有with公共表达式,这个是最好的,通过两个表做关联,8.0以下的取决于你的where条件了,icp可以谓词下推,in在优化器会自动转换成semi-jion,在8.0.4以后exists也可以使用semi join了,在之前的时候exists就只能使用dependent subquey了,exists 要想快的话是 小表驱动大表;所以说这里最重要的是看你的where条件中是否有筛选。如果没有的话,最好建临时表 或者用with,另外不要用select *,要不然在后面优化器 需要block nestloop的时候会有压力,如果都不让用的话,你目前的叙述,in比exists好