
1 laoli123 2017 年 8 月 3 日 我感觉直接用 ORDER BY ID 吧 如果 ID 是自增的 |
2 Alucns OP @xiaobai987 如果只用 ORDER BY id DESC 查询速度和 ORDER BY time DESC 是一样的。 |
3 imnpc 2017 年 8 月 3 日 列表页要显示哪些 请把哪些字段加索引 查询语句只查询需要的字段 |
4 Alucns OP @imnpc 列表是显示标题和内容,这个 varchar 和 text 不需要加索引吧,整个表也就大概有 10 个字段吧,除了标题和内容其它都是 int 型的数字。 |
5 id4alex 2017 年 8 月 3 日 cid 和 uid 上建一个索引就好了 |
6 sagaxu 2017 年 8 月 3 日 加个索引就行了 (cid,uid,time desc) |
7 zjsxwc 2017 年 8 月 3 日 explain 看下用了哪些索引。 |
8 sagaxu 2017 年 8 月 3 日 或者用(uid,cid,time desc) 哪个索引更快,看数据分布,多个 and 条件,把分布更稀疏的排前面更好 |
9 RuzZ 2017 年 8 月 3 日 如果是单列的索引,可以添加联合索引试试看。explain 下查询,看看实际上使用的索引情况 |
10 cnwtex 2017 年 8 月 3 日 把内容挪到另外一个表,用 id 关联起来,会提速百-千倍左右 |
11 Alucns OP |
15 sagaxu 2017 年 8 月 3 日 @Aluhao 贴 explain SELECT * FROM `article` WHERE cid=1 AND uid=100 ORDER BY time DESC LIMIT 20; 的结果 |
16 noNOno 2017 年 8 月 3 日 select * from (SELECT * FROM `article` WHERE cid=1 AND uid=100) t ORDER BY time DESC LIMIT 20; 放到子查询里走索引么 |
17 wayne712 2017 年 8 月 3 日 order by time, 如果 time 没有索引则会拖慢查询 , cid,uid 设置组合索引 |
18 Alucns OP @sagaxu 你的方法我测试了,可以优化一些 (cid,uid,time) desc 新建一个字段 desc 我以前是直接用 time 所以没效果 |
20 sagaxu 2017 年 8 月 3 日 @Aluhao desc 是让你建索引的时候按照 time 降序,order by time desc 的时候可以提高些许性能,不是增加一个 desc 字段 |
22 id4alex 2017 年 8 月 3 日 KEY `uid` (`uid`), KEY `cid` (`cid`), KEY `time` (`time`) 按道理说这种索引都不需要建立, 没卵用。 你建立联合索引( cid,uid )跑下 explain 就一清二楚了。 |
23 Alucns OP |
24 Alucns OP @id4alex 我试过了,cid 和 uid 不建索引 几十秒查不出来,你要看有 WHERE cid=1 AND uid=12091 还是有用的。 |
26 RuzZ 2017 年 8 月 3 日 你的 explain 结果贴一下 |
27 Alucns OP |
28 F281M6Dh8DXpD1g2 2017 年 8 月 3 日 先贴下加了联合索引的执行计划 |
30 frye 2017 年 8 月 3 日 @Aluhao MySQL 的一个 Query 只能用一条索引,所以你分别建索引是没有用的,MySQL 只会用其中一条索引。就像大家说的,你建一个 cid,uid,time 的联合索引就好了,多多仔细深入思考下。然后还得 explain 一下,看看用对了索引没有。 |
31 phx13ye 2017 年 8 月 3 日 人家让你这样建索引,把单条索引删掉,睿智 CREATE INDEX index_name ON article (cid, uid, time DESC) |
32 Alucns OP @frye 我有测试的,如果把单独索引去了,查询也是很慢,因为查询的时候除了排序还有条件,如: WHERE cid=1 AND uid=12091 |
34 frye 2017 年 8 月 3 日 |
35 daye 2017 年 8 月 3 日 索引是有使用顺序的,建了联合索引之后,请删除其他索引,确保正确性 |
36 zhx1991 2017 年 8 月 3 日 大体上讲 uid, time 的索引是没问题的 但是要看区分度, 你索引建完 explain 一下吧. 如果 cid 是分类我猜区分度巨低, 删了吧. |
41 gouchaoer 2017 年 8 月 3 日 via Android 让你贴 explain 你就贴啊,这么多人帮你看墨迹啥 |
42 akira 2017 年 8 月 3 日 SELECT * FROM 换成 select id , time 呢 |
44 frye 2017 年 8 月 3 日 @Aluhao MySQL 可以用 FORCE INDEX 语句指定使用哪个索引,另外如果 uid 比 cid 的离散度高的话,建立索引的时候建议把 uid 放在前面 CREATE INDEX index_name ON article (uid, cid, time DESC),另外如果你建立了 uid, cid, time DESC 的索引的话,就完全没有必要再单独给 uid 建立索引了。 |
46 simaguo 2017 年 8 月 3 日 unique (cid,uid,time desc)? |
47 debye 2017 年 8 月 3 日 索引也不是万能的 还有索引多了也有牺牲 |
49 orzfly 2017 年 8 月 3 日 |
50 dikT 2017 年 8 月 3 日 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; ) |
51 yanze0613 2017 年 8 月 3 日 ORDER BY time DESC LIMIT 20 会导致扫描大量数据,就很麻烦 |