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 秒了,还能再优化吗?
5966 次点击
所在节点    MySQL
53 条回复
xiaobai987
2017-08-03 16:21:48 +08:00
我感觉直接用 ORDER BY ID 吧 如果 ID 是自增的
Aluhao
2017-08-03 16:23:19 +08:00
@xiaobai987 如果只用 ORDER BY id DESC 查询速度和 ORDER BY time DESC 是一样的。
imnpc
2017-08-03 16:25:30 +08:00
列表页要显示哪些 请把哪些字段加索引
查询语句只查询需要的字段
Aluhao
2017-08-03 16:29:13 +08:00
@imnpc 列表是显示标题和内容,这个 varchar 和 text 不需要加索引吧,整个表也就大概有 10 个字段吧,除了标题和内容其它都是 int 型的数字。
id4alex
2017-08-03 16:29:38 +08:00
cid 和 uid 上建一个索引就好了
sagaxu
2017-08-03 16:32:14 +08:00
加个索引就行了 (cid,uid,time desc)
zjsxwc
2017-08-03 16:33:19 +08:00
explain 看下用了哪些索引。
sagaxu
2017-08-03 16:34:27 +08:00
或者用(uid,cid,time desc) 哪个索引更快,看数据分布,多个 and 条件,把分布更稀疏的排前面更好
RuzZ
2017-08-03 16:36:13 +08:00
如果是单列的索引,可以添加联合索引试试看。explain 下查询,看看实际上使用的索引情况
cnwtex
2017-08-03 16:37:34 +08:00
把内容挪到另外一个表,用 id 关联起来,会提速百-千倍左右
Aluhao
2017-08-03 16:39:34 +08:00
@zjsxwc

已经建立的索引

PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `cid` (`cid`),
KEY `time` (`time`)
Aluhao
2017-08-03 16:40:12 +08:00
@RuzZ 联合索引 (uid,cid,time) 也试过了,还是一样很慢
Aluhao
2017-08-03 16:41:08 +08:00
@id4alex 那二个都建立过索引了,主要是这个影响到了,加了 ORDER BY time DESC 就是全表扫描了
Aluhao
2017-08-03 16:41:44 +08:00
@cnwtex 这个可以考虑呀
sagaxu
2017-08-03 16:42:23 +08:00
@Aluhao 贴 explain SELECT * FROM `article` WHERE cid=1 AND uid=100 ORDER BY time DESC LIMIT 20; 的结果
noNOno
2017-08-03 16:45:38 +08:00
select * from (SELECT * FROM `article` WHERE cid=1 AND uid=100) t ORDER BY time DESC LIMIT 20;
放到子查询里走索引么
wayne712
2017-08-03 16:46:01 +08:00
order by time, 如果 time 没有索引则会拖慢查询 , cid,uid 设置组合索引
Aluhao
2017-08-03 16:49:52 +08:00
@sagaxu 你的方法我测试了,可以优化一些 (cid,uid,time) desc 新建一个字段 desc 我以前是直接用 time 所以没效果
Aluhao
2017-08-03 16:50:21 +08:00
@wayne712 time 有建立索引的
sagaxu
2017-08-03 16:51:36 +08:00
@Aluhao desc 是让你建索引的时候按照 time 降序,order by time desc 的时候可以提高些许性能,不是增加一个 desc 字段

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

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

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

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

© 2021 V2EX