【发布时间】:2010-02-07 15:19:07
【问题描述】:
我是 mysql 的新手,我已经为这个问题烦恼了好几天。我需要改进/优化这个查询,以便它运行得更快——现在它需要超过 5 秒。
这里是查询:
SELECT SQL_NO_CACHE COUNT(*) as multiple, a.*,b.*
FROM announcements as a
INNER JOIN stores as s
ON a.username=s.username
WHERE s.username is not null AND s.state='NC'
GROUP BY a.announcement_id
ORDER BY a.dt DESC LIMIT 0,10
Stores 表包括:store_id、username、name、state、city、zip 等...
Announcements表包括:announcement_id, msg, dt, username
stores 表有大约 10,000 条记录,announces 表有大约 500,000 条记录。
我想要用英语完成的工作 - 显示 10 个最近的商店公告,但让事情变得复杂的是,商店可以在 stores 表中具有相同用户 ID 的多个条目(每个位置一行)。因此,如果一家连锁店,比如说“Chipotle”发送了一条公告,我只想为他们的公告显示一行,旁边有一条注释,上面写着“这家商店有多个位置”。这就是我使用 count(*) 和 group by 的原因,所以如果 count(*) > 1 我知道公告有多个位置。
where 条件可以是任何州、城市或邮编。使用 SQL_NO_CACHE 是因为公告经常更新,因此您很少得到相同的结果,这有意义吗?
我非常感谢任何关于如何更好地做到这一点的建议。我对索引知之甚少,但我确实为两个表中的“用户名”字段创建了一个索引。随意在这里撕碎我,我知道我一定错过了什么。
更新——
DESC 商店;
Field Type Null Key Default Extra
store_id int(11) NO PRI NULL auto_increment
username varchar(20) NO MUL NULL
name varchar(100) NO NULL
street varchar(100) NO NULL
city varchar(50) NO NULL
state varchar(2) NO NULL
zip varchar(15) NO NULL
DESC 公告;
Field Type Null Key Default Extra
dt datetime NO NULL
username varchar(20) NO MUL NULL
msg varchar(200) NO NULL
announcement_id int(11) NO PRI NULL auto_increment
解释输出;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a index username PRIMARY 47 NULL 315001 Using temporary; Using filesort
1 SIMPLE b ref username username 62 a.username 1 Using where
【问题讨论】:
-
@Art: 可以添加当前查询的解释输出吗,它可以帮助数据库专家知道您需要什么样的索引
-
请发布包含索引的完整表格规范(例如使用
DESC mytable)。 -
@RageZ @Max S 更新了您要求的信息
-
我认为“order by”是真正减慢速度的原因——当我把这部分拿出来时,它运行得非常快。有什么办法可以避免对所有行进行文件排序?
标签: mysql optimization group-by sql-order-by