MYSQL 查询优化

2017-08-03 16:16:47 +08:00
 Aluhao
表 article 有 100 多万主题内容
cid 是分类,建立索引
uid 是用户 ID,建立索引
time 是发布时间,建立了索引
表内还有标题和内容及其它杂项字段

SELECT * FROM `article` WHERE cid=1 AND uid=100 ORDER BY time DESC LIMIT 20;

查询时间需要 0.5 秒,如果不加 ORDER BY time DESC 只需要 0.08 秒;
如果不加 ORDER BY time DESC 又达不到业务需求,我需要查询的是用户最新的主题内容,除了这个方法还有没其它更优化的查询方法?

还有就是当翻页更多的时候更慢 LIMIT 100, 20

我再经过优化了下语句:

SELECT * FROM `aws_article` WHERE cid=1 AND uid=100 ORDER BY time DESC, id DESC LIMIT 20;

增加了 id DESC 查询时间减少到 0.2 秒了,还能再优化吗?
5797 次点击
所在节点    MySQL
53 条回复
gouchaoer
2017-08-03 17:15:11 +08:00
让你贴 explain 你就贴啊,这么多人帮你看墨迹啥
akira
2017-08-03 17:15:41 +08:00
SELECT * FROM 换成 select id , time 呢
Aluhao
2017-08-03 17:16:13 +08:00
@gouchaoer 这里不能传图片呀
frye
2017-08-03 17:16:26 +08:00
@Aluhao MySQL 可以用 FORCE INDEX 语句指定使用哪个索引,另外如果 uid 比 cid 的离散度高的话,建立索引的时候建议把 uid 放在前面 CREATE INDEX index_name ON article (uid, cid, time DESC),另外如果你建立了 uid, cid, time DESC 的索引的话,就完全没有必要再单独给 uid 建立索引了。
Aluhao
2017-08-03 17:18:52 +08:00
@frye 好的,谢谢
simaguo
2017-08-03 17:26:51 +08:00
unique (cid,uid,time desc)?
debye
2017-08-03 17:27:51 +08:00
索引也不是万能的
还有索引多了也有牺牲
Aluhao
2017-08-03 17:30:13 +08:00
@simaguo CID 是分类 UID 是用户 ID TIME 是时间
orzfly
2017-08-03 17:33:33 +08:00
@Aluhao #43 觉得“发不了图”为什么不早点说呢?

https://www.v2ex.com/t/130567?p=1
dikT
2017-08-03 17:42:40 +08:00
SELECT * FROM `aws_article` WHERE id in (SELECT id FROM `aws_article` WHERE cid=1 AND uid=100 ORDER BY id DESC LIMIT 100, 20; )
yanze0613
2017-08-03 17:42:56 +08:00
ORDER BY time DESC LIMIT 20
会导致扫描大量数据,就很麻烦
joeke
2017-08-03 17:55:54 +08:00
@orzfly 为什么不早说,哈哈
Aluhao
2017-08-06 11:11:06 +08:00
@dikT 对,用 IN 取数据也快

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

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

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

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

© 2021 V2EX