新手请教 MySQL 的 where in 语句的优化

2018-05-28 16:06:48 +08:00
 peizhao2017
新手请教 MySQL 的 where in 语句的优化

select id from 表 A where id in (select id from 表 B where id=$id) ORDER BY time DESC limit 0,50

虽然能用
但是很慢
请教下还可以怎么写才能快些
3373 次点击
所在节点    问与答
13 条回复
Aluhao
2018-05-28 16:16:06 +08:00
我也有类似这样写,不会慢哦;
id in 里数据多吗?
time 要索引,否则会很慢;
peizhao2017
2018-05-28 16:25:28 +08:00
@Aluhao #1
谢谢
把 time 加上了索引
有改善了
但数据量稍微一多还是卡
表 B 现在 30w 条数据
id in 里面 5000 多条
50 条一分页
前几页速度还好
到了后面很慢
不知道哪里写的不对
hahastudio
2018-05-28 16:26:00 +08:00
试试 exists 或者 join
peizhao2017
2018-05-28 16:35:40 +08:00
@hahastudio #3

查了下
有说法
外层查询表小于子查询表,则用 exists,外层查询表大于子查询表,则用 in,如果外层和子查询表差不多,则爱用哪个用哪个
我两个表差不多大
换 exists 应该速度差不多

join 一直没看懂
我这条 sql 用 join 要怎么写呢
ilylx2008
2018-05-28 16:45:46 +08:00
select id where id=$id 这没必要吧,估计你写错了。

你把 in 语句和 select id 语句分开执行试试看。
in 5000 个 id 一般不会慢
peizhao2017
2018-05-28 17:01:04 +08:00
@ilylx2008 #5
$id 是个程序传来变量值没写错

又优化了下

把 id 的 int 长度从 50 位改到 11 位
都做了索引
50 条一分页的情况下
第一页飞快
越往后翻页越慢

阿里云的 1 核 1G 内存主机
mysql 5.5
php 7.2
不知道哪里问题
机器配置太差?
turan12
2018-05-28 17:12:52 +08:00
limit 就是越往后越慢
polymerdg
2018-05-28 17:16:21 +08:00
inner join 为什么不用
peizhao2017
2018-05-28 17:46:06 +08:00
@polymerdg #8

新手不会写
要是用 inner join 要怎么写呢
可以给个参考吗
boks
2018-05-29 13:46:00 +08:00
select A.id from A,B where A.id = B.id and B.id=$id ORDER BY A.time DESC limit 0,50
boks
2018-05-29 13:47:04 +08:00
你这 time 是创建时间吗? 如果是越后面越大的话可以用 id 代替
peizhao2017
2018-05-29 13:58:16 +08:00
@boks #11

time 是修改时间

用 id 的话还是要再取修改时间再排序吧
我直接按照修改时间倒序
不知哪种排序法速度快些

另外
select A.id from A,B where A.id = B.id and B.id=$id ORDER BY A.time DESC limit 0,50
没看懂
有关键词吗我去学习下
ccgoing10
2018-05-29 14:14:51 +08:00
A.IDB.ID 唯一就直接表关联,不唯一就 exists

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/458391

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX