惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
腾讯CDC
T
Threatpost
L
Lohrmann on Cybersecurity
P
Proofpoint News Feed
The Cloudflare Blog
博客园 - 聂微东
MyScale Blog
MyScale Blog
M
MIT News - Artificial intelligence
Hacker News - Newest:
Hacker News - Newest: "LLM"
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Project Zero
Project Zero
Simon Willison's Weblog
Simon Willison's Weblog
S
Schneier on Security
Spread Privacy
Spread Privacy
The GitHub Blog
The GitHub Blog
D
DataBreaches.Net
S
Securelist
Schneier on Security
Schneier on Security
Microsoft Azure Blog
Microsoft Azure Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
博客园 - 叶小钗
量子位
I
InfoQ
J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
人人都是产品经理
人人都是产品经理
博客园_首页
C
CERT Recently Published Vulnerability Notes
I
Intezer
Y
Y Combinator Blog
T
Tailwind CSS Blog
Microsoft Security Blog
Microsoft Security Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
大猫的无限游戏
大猫的无限游戏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
A
About on SuperTechFans
A
Arctic Wolf
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
G
Google Developers Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Vercel News
Vercel News
PCI Perspectives
PCI Perspectives
The Last Watchdog
The Last Watchdog
月光博客
月光博客

MySQL

请教大家一个关于 mysql 服务崩溃的问题 - V2EX 数据库连接数超了如何解决 - V2EX count 的语句优化问题 - V2EX 连接 MySQL 很慢的问题 - V2EX MYSQL UPDATE 在很短的时间内更新相同的语句,就会有告警,导至事务失败,有没有人遇到这问题? MySQL 磁盘读取飙升,导致阿里云服务器卡死 - V2EX 求 Macos 下面 homebrew 安装 mysql 到指定目录的方法 使用 EXISTS 优化 IN 子查询 - V2EX 什么时候可以将 mysql 默认隔离机制改为读已提交 跨平台的 MySQL Parser - V2EX MySQL 大表排序有什么好的方案?只能上 Mongo? Mysql 无法修改自增主键的 AUTO_INCREMENT 值 升级服务器后, mysql 性能反而更慢了,求排查思路 《高性能 MySQL》第三版:是否已经过时? 坑爹的字符集问题:踩到了 MySQL 的 bug 两个人的数据开发团队,被要求从零开始治理企业数据 MySQL 8.4 LTS 与 Metabase 奇怪兼容性问题:降级到 8.0.4 后问题解决 (1Panel and BT Panel 复现) - V2EX 公司内网,怎么搭建主备 mysql,高可用。故障自动切。 不买云服务 mysql 自增 ID 突然变为 int 最大值问题 覆盖还原 data 文件夹后, mysql 无法启动了 - V2EX 生产力工具 - V2EX 各位大佬,有个奇葩的技术问题 - V2EX 关于 mysql trx_id 的疑惑 发帖一问 sql 性能讨论 - V2EX 数据库高频更新问题 谁遇到过没 有啥好的解决方案部 - V2EX 有用过 SyncNavigator 或者类似的简单数据库同步软件吗, - V2EX mysql 遇到最愚蠢的查询性能问题,求解决 - V2EX 有什么优雅的 mysql 增加字段名的方法呢? - V2EX 各位 Mysql 大佬,问一个 8.0 版本 json 的问题 - V2EX mysql online DDL 时间很长,咋整,数据量不多,就 30W - V2EX 数据库中 select for update 和 version 乐观锁各自的适用场景是啥? - V2EX mysql 宿主机没有办法访问的问题 - V2EX mysql 求助 - V2EX MySQL 8.4 MGR 可以上生产吗? - V2EX mysql 亿级数据,数据筛选和导入导出 - V2EX 大佬们你们 Mysql 的数据库名称怎么分割的? - V2EX mysql 数据增量同步 - V2EX 新项目准备启动, MYSQL 选择 8.4.2 这个版本,有没什么坑? - V2EX mysql 一年新增 800 多万条数据,如果是单表的话请问服务器能支撑吗?各位有什么好的办法吗? - V2EX 新手求个远程数据库稳妥的解决方案~或者实时备份数据库的方法 - V2EX 铁子们,求助 docker 中 MySQL 导入数据库速度问题 - V2EX 大家的 SQL 一般怎么管理? - V2EX 现在用 mysql 的多 还是 mariadb 的多 - V2EX 关于 MySQL 查询咨询 - V2EX 请教个问题,如何快速的删除 mysql 的数据 求助:Mysql 数据文件夹如何被新安装的 Mysql 读取 - V2EX mysql 有没有什么中间件能模拟 mongodb? - V2EX 请问 debian12 mysql5.7 可以通过添加 apt 源安装吗?
询问一个慢查询的问题 - V2EX
newboy1 · 2024-11-05 · via MySQL

这是一个创建于 586 天前的主题,其中的信息可能已经有所发展或是发生改变。

假设有一张 software 表,表结构如下

software_id (int) author_id (int) create_time update_time
1 1 2024-11-05 11:00:00 2024-11-05 11:00:00
2 2 2024-11-05 11:00:00 2024-11-05 11:00:00

其中 software_id 是主键,author_id 是普通索引

还有一张 company_software 表,表结构如下

company_software_id (int) author_id (int) country(varchar) software_id (varchar)
1 1 china 1
2 1 china kkk

其中 company_software_id 是主键,author_id 、country 、software_id 是一个复合索引。

以上表数据量只有 1~5w 。

1 、SQL1

SELECT 1
FROM company_software AS company_software
WHERE company_software.author_id  = 1
  and company_software.country  in ('china', 'korea', 'england')
  and company_software.software_id    = '1'

并不会导致慢查询

2 、SQL2

SELECT software_id
FROM sortware
WHERE author_id  = 1
  and NOT EXISTS (SELECT 1
                  FROM company_software AS company_software
                  WHERE company_software.author_id = 1
                    and company_software.country in ('china', 'korea', 'england')
                    and CONVERT(sortware.software_id , char) = company_software.software_id)
LIMIT 0, 100

为什么会导致慢查询,懂的大佬帮忙分析下

第 1 条附言  ·  2024 年 11 月 5 日

SQL

explain SELECT software_id
FROM software
WHERE author_id  = 1
  and NOT EXISTS (SELECT 1
                  FROM company_software AS company_software
                  WHERE company_software.author_id = 1
                    and company_software.country in ('china', 'korea', 'england')
                    and CONVERT(software.software_id , char) = company_software.software_id)
LIMIT 0, 100;
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 PRIMARY software ref idx_authorid idx_authorid 5 const 1 100 Using where; Using index
2 DEPENDENT SUBQUERY company_software ref idx_authorid_country_softwareid idx_authorid_country_softwareid 5 const 8 50 Using where; Using index

software只有一条数据,company_software有八条数据,country都是china

admol

1

admol      2024 年 11 月 5 日

and sortware.software_id = CONVERT(company_software.software_id , char)

换一下顺序试试

wuych

3

wuych      2024 年 11 月 5 日 via iPhone

子查询的 where 里用了函数之后你的整个子查询就不走索引了吧,你把那个 convert 放到外面呗。

newboy1

5

newboy1      2024 年 11 月 5 日

@wuych explain 后是有走索引的,但是 rows 数量比较大

newboy1

7

newboy1      2024 年 11 月 5 日

另外如果不使用 in 查询,直接使用等值查询,并不会出现慢查询

seedhk

8

seedhk      2024 年 11 月 5 日

贴一下执行计划

fengpan567

11

fengpan567      2024 年 11 月 5 日

CONVERT(sortware.software_id , char) = company_software.software_id 导致的慢查询,分两步查吧

Chinsung

12

Chinsung      2024 年 11 月 6 日

你贴个 explain 结果然后说你不理解我都可以理解

redog

13

redog      2024 年 11 月 6 日

如果我没有弄错的话 是因为 NOT EXISTS 的原因,这里会导致你最后一个 where CONVERT(sortware.software_id , char) = company_software.software_id 这个是无效的,因为在 mysql 看来,这里不用专门去匹配,直接按前面的条件取回 N 条记录,在这 N 条记录里去检查 software_id 就行了。

这样会导致外层查询时子查询里返回的不是一条记录,而是一堆记录,在这一堆记录里去判断 software_id 是否相等,应该试试用 not in 本质是 inner join 这样会先按索引来一次性筛选,而不是每一条都要去筛选。

coderzhangsan

14

coderzhangsan      2024 年 11 月 6 日

有一点不明白,为什么 software_id 在一张表是主键 id(int 类型),另一张表则是 varchar 类型,难道不应该数据类型一致吗?开发中,如果不注意的化,查询会导致隐式转换,这就导致你的 SQL 必须用函数转换,因而 SQL 查询变得复杂。

isnullstring

15

isnullstring      2024 年 11 月 6 日

where 语句里使用函数 都是导致索引失效喔

相同字段在不同表定不同类型,一开始写代码赶工期、马虎了事,跟我现在接手的系统一毛一样

redog

16

redog      2024 年 11 月 7 日

另外你的类型不一致,要进行一次手动转换,不然还是会回到 DEPENDENT SUBQUERY ,具体的话,你应该试试:
SELECT software_id from software where author_id = 1 and CONVERT(software_id,char) not in ( select software_id FROM company_software WHERE author_id = 1 and country in ('china', 'korea', 'england') )
这样在 mysql 看来子查询是独立于主查询的,这样只会执行一次子查询,上面都使用了索引,如果你不使用 convert 去转换,因为类型不一致,mysql 又会先看 author_id 有多少条,有多少条就执行多少次子查询,这样就慢了。