如何管理从多个表中选择多个数据?

时间:2011-07-24 01:23:05

标签: php mysql sql

我的mysql数据库中有3个表, 其中2个有10,000多行,第3个有100多行。

我的查询是

SELECT `deals`.`name`,
       `deals`.`id` as `deals_id`, 
       `reports`.`dealid`,
       `reports`.`pdeealnum`,
       `reports`.`pconfirmed`,
       `reports`.`pdate`,
       `reports`.`ppay`,
       `reports`.`pfname`,
       `reports`.`plname`,
       `reports`.`pmail`,
       `reports`.`paddress`,
       `reports`.`pphone`,
       `reports`.`pdate`,
       `orders`.`id` as `coupon`,
       `orders`.`dealid`
  FROM `deals`
LEFT JOIN `reports` ON `reports`.`dealid` = `deals`.`id`
LEFT JOIN `orders` ON `orders`.`dealid` = `deals`.`id`
    WHERE `reports`.`pdate` >= '".strtotime($_POST['start_date'])."'
      AND `reports`.`pdate` <='".strtotime($_POST['end_date'])."'
 ORDER BY `reports`.`pdate` DESC

如何在没有网站卡住或失败的情况下管理选择这么多数据?

2 个答案:

答案 0 :(得分:2)

确保您的dba将相应的索引添加到pdate字段。

然后,如果您发现遇到性能问题,请研究提高性能的更高级方法。像应用程序中的分页,分区表等等。

答案 1 :(得分:1)

要了解报告中使用的索引(如果有),请在查询中运行EXPLAIN

你可能想要索引

  • deals.id(虽然我假设它已经是主键,因此不需要另一个索引)
  • orders.dealid
  • reports.dealid
  • reports.pdate

另外,请确保deals.id与orders.dealid和reports.dealid(包括NULL / NOT NULL和signed / unsigned)完全相同的数据类型。