我是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
商店
表包括:商店ID、用户名、名称、州、市、邮编等…
公告
表包括:announcement_id、msg、dt、username
stores表有大约10000条记录,announcements表有大约500000条记录。
我试图用英语完成的是——显示10个最近的商店公告,但让这变得复杂的是,商店可以在stores表中有多个具有相同用户id的条目(每个位置一行)。所以,如果一家连锁店,比如说“Chipotle”发送了一个公告,我只想在他们的公告中显示一行,旁边写着“这家店有多个位置”。这就是为什么我要使用count(*)和group by,所以如果
count(*) > 1
我知道有很多地方可以发布公告。
where条件可以是任何州、市或邮政编码。使用sql_no__缓存是因为公告经常更新,所以很少得到相同的结果,这有意义吗?
我真的很感激你能给我一些建议,让我把事情做得更好。我对索引知之甚少,但我确实为两个表中的“username”字段创建了索引。你可以在这里把我撕成碎片,我知道我一定错过了什么。
更新——
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
说明公告;
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