首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >慢MySQL查询

慢MySQL查询
EN

Stack Overflow用户
提问于 2010-10-11 05:16:49
回答 2查看 1.4K关注 0票数 2

据我所知,我已经尽力使这个查询更快了。每个表的相同引擎,用于联接、order或where子句的所有字段的索引。

问题似乎是表aamag没有使用索引,尽管有可用的索引。

查询:

代码语言:javascript
复制
    SELECT DISTINCT `a`.`id`, `a`.`full_name`, `a`.`rating`, `a`.`licence`, `a`.`licence_issued`, `ag`.`name` as agency_name
FROM (`property_suburb_map` psm)
JOIN `campaign_property_map` cpm ON `psm`.`property_id` = `cpm`.`property_id`
JOIN `campaign` c ON `cpm`.`campaign_id` = `c`.`id`
JOIN `campaign_agent_map` cam ON `cpm`.`campaign_id` = `cam`.`campaign_id`
JOIN `agent` a ON `cam`.`agent_id` = `a`.`id`
JOIN `agency_agent_map` aam ON `aam`.`agent_id` = `a`.`id`
JOIN `agency` ag ON `aam`.`agency_id` = `ag`.`id`
WHERE `c`.`closing_date` >= '2009-10-12'
AND `psm`.`suburb_id` = '5911'
AND `a`.`status` = 'Active'
ORDER BY `a`.`rating` DESC, `a`.`full_name`
LIMIT 12

解释(抱歉,格式化搞砸了):使用这个图像而不是http://imgur.com/UzSpC.jpg

代码语言:javascript
复制
id  select_type     table           type    possible_keys   key     key_len     ref     rows    Extra

1   SIMPLE          a               ref     PRIMARY,status  status  1   const   790     Using where; Using temporary; Using filesort
1   SIMPLE          aam             ref     agency_id_2,
                                            agent_id,
                                            agency_id       agent_id      4     hindsight.a.id  1    
1   SIMPLE          ag              eq_ref  PRIMARY     PRIMARY     4   hindsight.aam.agency_id     1    
1   SIMPLE          cam             ref     agent_id,
                                            campaign_id     agent_id    4   hindsight.a.id  9   Distinct
1   SIMPLE          c               eq_ref  PRIMARY,closing_date    PRIMARY     4   hindsight.cam.campaign_id   1   Using where; Distinct
1   SIMPLE          cpm             ref     campaign_id     campaign_id     4   hindsight.c.id  1   Using where; Using index; Distinct
1   SIMPLE          psm             ref     property_id,suburb_id   property_id     4   hindsight.cpm.property_id   1   Using where; Distinct

以下是数据库http://pastebin.com/Rbyrj6x3的相关结构

编辑我已经对查询做了一个概要文件:Copying to tmp table真的很慢。

代码语言:javascript
复制
mysql> show profile for query 6;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000000 |
| Opening tables       | 0.000000 |
| System lock          | 0.000000 |
| Table lock           | 0.000000 |
| init                 | 0.000000 |
| optimizing           | 0.000000 |
| statistics           | 0.000000 |
| preparing            | 0.000000 |
| Creating tmp table   | 0.000000 |
| executing            | 0.000000 |
| Copying to tmp table | 0.112000 |  <- WTF!
| Sorting result       | 0.004000 |
| Sending data         | 0.000000 |
| end                  | 0.000000 |
| removing tmp table   | 0.000000 |
| end                  | 0.000000 |
| query end            | 0.000000 |
| freeing items        | 0.000000 |
| logging slow query   | 0.000000 |
| cleaning up          | 0.000000 |
+----------------------+----------+
20 rows in set (0.00 sec)
EN

回答 2

Stack Overflow用户

发布于 2010-10-11 05:30:26

所有表的所有字段都有外键吗?请描述一下你们的桌子

票数 1
EN

Stack Overflow用户

发布于 2010-10-11 08:24:52

尝试将agent.status上的索引转换为覆盖索引,方法是添加agent_id作为第二个组件:

代码语言:javascript
复制
create index idx2 on agent( status, id)

这可能使查询在不得不从数据表检索记录之前消除更多的代理行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3903668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档