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