【问题标题】:MySQL query optimisation helpMySQL查询优化帮助
【发布时间】:2010-09-03 00:53:35
【问题描述】:

希望您能帮助我在正确的轨道上开始优化我的查询。我以前从来没有过多地考虑过优化,但是我有一些类似于下面的查询,并想开始专注于提高它们的效率。我急需优化的查询示例如下:

SELECT COUNT(*) AS `records_found` 

FROM (`records_owners` AS `ro`, `records` AS `r`) 

WHERE r.reg_no = ro.contact_no 

AND `contacted_email` <> "0000-00-00" 

AND `contacted_post` <> "0000-00-00" 

AND `ro`.`import_date` BETWEEN "2010-01-01" AND "2010-07-11" AND `r`.`pa_date_of_birth` > "2010-01-01" AND EXISTS ( SELECT `number` FROM `roles` WHERE `roles`.`number` = r.`reg_no` )

在上面运行 EXPLAIN 会产生以下结果:

| id | select_type        | table | type   | possible_keys | key     | key_len | ref                                   | rows  | Extra       |

+----+--------------------+-------+--------+---------------+---------+---------+---------------------------------------+-------+-------------+

|  1 | PRIMARY            | r   | ALL    | NULL          | NULL    | NULL    | NULL                                  | 21533 | Using where | 

|  1 | PRIMARY            | ro  | eq_ref | PRIMARY       | PRIMARY | 4       |          r.reg_no |     1 | Using where | 

|  2 | DEPENDENT SUBQUERY | roles  | ALL    | NULL          | NULL    | NULL    | NULL                                  |   189 | Using where | 

【问题讨论】:

    标签: mysql optimization query-optimization


    【解决方案1】:

    如您所见,您有一个依赖子查询,这是 MySQL 中性能最差的事情之一。提示见这里:

    http://dev.mysql.com/doc/refman/5.0/en/select-optimization.html

    http://dev.mysql.com/doc/refman/5.0/en/in-subquery-optimization.html

    【讨论】:

    • 谢谢麦克尔。用连接替换子查询并大大加快了查询速度。我是否也应该考虑为上述表格添加索引?