sql in(sql in语句的性能问题)

本文目录
- sql in语句的性能问题
- mysql 1064错误
- mysql 数据库乱码问题,页面,数据库都是UTF-8 的字符集,为什么INSERT INTO插入后会是乱码呢
- MySQL-mysql中SELECT INTO FROM与INSERT INTO SELECT 有何区别
- 用mysql模糊查询%like% 当输入框什么都没有输入的时点提交,数据库全部内容返回,怎么处理
- mysql batchinsert怎么获取主键id
- 怎样设置使mysql支持中文的插入
- sql注入是什么意思
- MYSQL导入出错 提示#1064 有图有数据文件
- 关于mysql_insert_id()的问题,为什么返回的值是0
sql in语句的性能问题
每个机票订单含有多个票,用符合条件的订单List,去查询对应的票List。
两张表的关联方式是用一个特性的key关联,其中包含,代理商区分标志,订单号,订单类型等,是一个长度在30~50之间的varchar
遍历list一条一条查的话,IO太多,显然不合适。我们就想到用in来实现批量查询
在beta测试时,库中表里只有一个月的数据,大约在1000万左右,测试时没有发现问题。
到了线上之后,发现查询数据非常慢,两万左右的in条件,查询起来,时间在10分钟左右,显然出现了慢查询。
针对这个问题,做了几个测试,看了下执行计划,如下所示
事实上我们看到,在in语句中数据量不大的情况下,索引是有效的,不过这个数量已经是极限了。
下面是我的语句
这里在in里面包含了三万条数据,索引实效了。
这里我们首先想到,强制使用索引会不会有所帮助如下
但是,事实上并没有效果,这是结果
解下来我们分析一下,两个问题,索引为什么会失效
这个问题需要从两个方面入手
1.索引区分度
2.预计扫描行数
3.优化器的选择
先看第一个,索引的区分度,经过随机采样,看着内容还是很高的。
预计扫描行数
预计扫描行数的话,如前两图所示,基本都走了全表扫描。
优化器的选择
优化器选择时,衡量了回表等操作,综合考虑,这里没有办法继续下去了,只能问到DBA了。
在数据表大时,索引负重较大,同样的情况下,in语句里面数据条数够大时,索引会失效,可以通过force index尝试一下,不过成功的可能行很小,尽量分批去查找,批次数量可配置。
mysql 1064错误
语法问题 是不是 后面没有加“;”
贴出的user表结构,不然肯定不知道哪里错了
mysql 数据库乱码问题,页面,数据库都是UTF-8 的字符集,为什么INSERT INTO插入后会是乱码呢
一、转码失败
在数据写入到表的过程中转码失败,数据库端也没有进行恰当的处理,导致存放在表里的数据乱码。
针对这种情况,前几篇文章介绍过客户端发送请求到服务端。
其中任意一个编码不一致,都会导致表里的数据存入不正确的编码而产生乱码。
比如下面简单一条语句:
set @a = "文本字符串";
insert into t1 values(@a);
变量 @a 的字符编码是由参数 CHARACTER_SET_CLIENT 决定的,假设此时编码为 A,也就是变量 @a 的编码。
2. 写入语句在发送到 MySQL 服务端之前的编码由 CHARACTER_SET_CONNECTION 决定,假设此时编码为 B。
3. 经过 MySQL 一系列词法,语法解析等处理后,写入到表 t1,表 t1 的编码为 C。
那这里编码 A、编码 B、编码 C 如果不兼容,写入的数据就直接乱码。
二、客户端乱码
表数据正常,但是客户端展示后出现乱码。
这一类场景,指的是从 MySQL 表里拿数据出来返回到客户端,MySQL 里的数据本身没有问题。客户端发送请求到 MySQL,表的编码为 D,从 MySQL 拿到记录结果传输到客户端,此时记录编码为 E(CHARACTER_SET_RESULTS)。
那以上编码 E 和 D 如果不兼容,检索出来的数据就看起来乱码了。但是由于数据本身没有被破坏,所以换个兼容的编码就可以获取正确的结果。
这一类又分为以下三个不同的小类:
1)字段编码和表一致,客户端是不同的编码
比如下面例子, 表数据的编码是 utf8mb4,而 SESSION 1 发起的连接编码为 gbk。那由于编码不兼容,检索出来的数据肯定为乱码。
2)表编码和客户端的编码一致,但是记录之间编码存在不一致的情形
比如表编码是 utf8mb4,应用端编码也是 utf8mb4,但是表里的数据可能一半编码是 utf8mb4,另外一半是 gbk。那么此时表的数据也是正常的,不过此时采用哪种编码都读不到所有完整的数据。这样数据产生的原因很多,比如其中一种可能性就是表编码多次变更而且每次变更不彻底导致(变更不彻底,我之前的篇章里有介绍)。举个例子,表 t3 的编码之前是 utf8mb4,现在是 gbk,而且两次编码期间都被写入了正常的数据。
3)每个字段的编码不一致,导致乱码和第二点一样的场景。不同的是:非记录间的编码不统一,而是每个字段编码不统一。举个例子,表 c1 字段 a1,a2。a1 编码 gbk,a2 编码是 utf8mb4。那每个字段单独读出来数据是完整的,但是所有字段一起读出来,数据总会有一部分乱码。
三、LATIN1
还有一种情形就是以 LATIN1 的编码存储数据
估计大家都知道字符集 LATIN1,LATIN1 对所有字符都是单字节流处理,遇到不能处理的字节流,保持原样,那么在以上两种存入和检索的过程中都能保证数据一致,所以 MySQL 长期以来默认的编码都是 LATIN1。这种情形,看起来也没啥不对的点,数据也没乱码,那为什么还有选用其他的编码呢?原因就是对字符存储的字节数不一样,比如 emoji 字符 "",如果用 utf8mb4 存储,占用 3 个字节,那 varchar(12) 就能存放 12 个字符,但是换成 LATIN1,只能存 4 个字符。
MySQL-mysql中SELECT INTO FROM与INSERT INTO SELECT 有何区别
select into from 会帮你把表也创建了,,要求新表名的表不存在,
insert into .... select 表已存在,只导数据进新表
用mysql模糊查询%like% 当输入框什么都没有输入的时点提交,数据库全部内容返回,怎么处理
一般系统中如果查询条件什么都不填 就应该返回全部数据集
所以这样返回内容是正确的
如果你想屏蔽掉按空模糊匹配的话 需要在前台和后台进行验证输入值是否为空
就是页面端与程序代码里 数据库里是没有办法屏蔽这个问题的
mysql batchinsert怎么获取主键id
1. SELECT MAX(id) FROM tablename;
2. LAST_INSERT_ID() 函数
LAST_INSERT_ID 是与table无关的,与你最近一个插入数据的表有关。如果向表a插入数据后,再向表b插入数据,LAST_INSERT_ID会改变。
在多用户交替插入数据的情况下MAX(id)显然不能用。这时就该使用LAST_INSERT_ID了,因为LAST_INSERT_ID是基于Connection的,只要每个线程都使用独立的 Connection对象,LAST_INSERT_ID函数将返回该Connection对AUTO_INCREMENT列最新的insert or update 操作生成的第一个record的ID。这个值不能被其它客户端(Connection)影响,保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁。
使用单条INSERT语句插入多条记录, LAST_INSERT_ID返回的是列表中插入的第一条记录的id。
3. SELECT @@IDENTITY;
@@identity 是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。一般系统定义的全局变量都是以@@开头,用户自定义变量以@开头。
比如有个表A,它的自增列是id,当向A表插入一行数据后,如果插入数据后自增列的值自动增加至101,则通过select @@identity得到的值就是101。它也是基于connection的,每个线程独立使用的。使用@@identity的前提是在进行insert操作后,执行select @@identity的时候连接没有关闭,否则得到的将是NULL值。
4. SHOW TABLE STATUS where name ="tablename";
得出的结果里边对应表名记录中有个Auto_increment字段,里边有下一个自增ID的数值。根据表自增列设置的自增量,以这个值减去自增量,就是当前该表数据记录的最大自增ID。
它也是基于connection的,每个线程独立使用的。
怎样设置使mysql支持中文的插入
1. 安装mysql的时候,会选择默认的字符集,请选择utf-8,因为utf-8才是王道. 2. 如果你不想改字符集,那么建议你把数据表的字符集改为utf-8或者是gbk,建议utf-8. 3. 如果你不介意数据库乱码,在取出数据的时候你可以加上 mysql_query("set names gbk")这样就可以将乱码的中文正确显示. 4. 要避免乱码,你一定要保证字符集的一致性.从你的数据库,数据表,以及你输出的页面.尽量使用utf-8. 如果还没有解决你的问题,你可以自己搜索解决 关键字 mysql 字符集 或者是 mysql 乱码. 很多答案.
sql注入是什么意思
SQL注入属于注入式攻击,这种攻击是因为在项目中没有将代码与数据隔离,在读取数据的时候,错误地将数据作为代码的一部分执行而导致的。
如何处理SQL注入情况?三个方面:
1、过滤用户输入参数中的特殊字符,降低风险;
2、禁止通过字符串拼接sql语句,严格使用参数绑定来传入参数;
3、合理使用数据库框架提供的机制。
MYSQL导入出错 提示#1064 有图有数据文件
1:把这个删掉 --This file is used to create Tables and Store Procedure in mysql database
2:TYPE=MyISAM 的type改成ENGINE. 现在新版本的都用ENGINE
3:最后个表 `UpdateTime` timestamp(14) 改成 `UpdateTime` timestamp 不带范围。
关于mysql_insert_id()的问题,为什么返回的值是0
你可以在建表的时候,将id的字段设置为自增。然后将下面的语句
$result = $conn-》query("INSERT INTO title VALUES (’’,’".$title."’,’".$_SESSION."’)");
改为:
$result = $conn-》query("INSERT INTO title (title,auth) VALUES (’".$title."’,’".$_SESSION."’)");
同样,
$result2 = $conn-》query("INSERT INTO content VALUES (’’,’".$lastid."’,’".$content."’)");
也改为:
$result2 = $conn-》query("INSERT INTO content (titleid,content) VALUES (’".$lastid."’,’".$content."’)");
有问题你可以继续追问,或者加我百度hi好友,我一般都在线。希望能帮到你。

本文相关文章:
insertintoselectmysql覆盖(php mysql insert into 结合详解及实例代码)
2025年9月7日 19:45
更多文章:
exception词组(innerexception是什么意思)
2026年9月7日 17:15
oracle数据库完整性(oracle添加记录的时候提示违反完整性约束,未找到父项关键字怎么解决)
2025年10月15日 22:30
dirty talk女生对男生说的语录(女人怎么说dirty talk)
2025年12月16日 07:30
电脑开机出现error怎么解决(电脑开机显示CPU OverTemperture Error怎么解决)
2026年4月3日 10:30
requests是什么库(python3 有requests吗)
2026年2月6日 09:15
hairdresser翻译(at the hairdresser’s怎么读)
2026年5月25日 12:00
无法获得下列许可 solidworks(solidworks无法获得许可-8,544,0)
2025年11月27日 18:00
原矛头蝮的天敌(蛇到底有多可怕大自然中的蛇真会记仇报复人吗)
2026年3月13日 17:45
artist怎么读(artist怎么读 英语artist怎么读)
2025年12月6日 02:30
subplot 2 2 3 是什么意思(matlab 中subplot(221)是什么意思)
2025年9月21日 05:45
设置一个按钮跳转到一个页面(如何在H5页面里面添加功能按钮,点击跳转另一页面)
2026年4月9日 21:00
数控车床编程入门自学视频和模拟(请问数控车床手工编程视频教程哪有下载)
2025年9月6日 17:45












