Php 如何避免在MySQL请求中加入表

Php 如何避免在MySQL请求中加入表,php,mysql,Php,Mysql,我正在创建一个包含3列的报告表:当天的总计数、pt_scanid的计数,这对于表和当天的日期来说是完全唯一的 以下是表模式: CREATE TABLE IF NOT EXISTS `partners_scanstracking` ( `pt_id` int(11) NOT NULL AUTO_INCREMENT, `pt_partner_id` int(5) NOT NULL, `pt_ip` varchar(30) NOT NULL, `pt_scanid` varchar(50) NOT N

我正在创建一个包含3列的报告表:当天的总计数、pt_scanid的计数,这对于表和当天的日期来说是完全唯一的

以下是表模式:

CREATE TABLE IF NOT EXISTS `partners_scanstracking` (
`pt_id` int(11) NOT NULL AUTO_INCREMENT,
`pt_partner_id` int(5) NOT NULL,
`pt_ip` varchar(30) NOT NULL,
`pt_scanid` varchar(50) NOT NULL,
`pt_fn` varchar(20) DEFAULT NULL,
`pt_url` mediumtext,
`pt_created` datetime NOT NULL,
PRIMARY KEY (`pt_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=0;
以下是我创建的请求:

SELECT COUNT(DISTINCT `c`.`pt_created`) AS `count`,
       COUNT(DISTINCT `x`.`pt_scanid`) AS `uniq`,
       `c`.`pt_created`
FROM `partners_scanstracking` c
LEFT JOIN
  (SELECT `x`.*
   FROM
     (SELECT *
      FROM `partners_scanstracking`
      WHERE `pt_partner_id` = '0'
      ORDER BY `pt_created` ASC) x
   GROUP BY `pt_scanid`) x ON DATE(`c`.`pt_created`)=DATE(`x`.`pt_created`)
WHERE (DATE(`c`.`pt_created`) >= '2016-10-06'
       AND DATE(`c`.`pt_created`) <= '2016-12-14')
  AND `c`.`pt_partner_id` = '0'
GROUP BY DATE(`c`.`pt_created`)
ORDER BY `c`.`pt_created` ASC
以前一切都很好,但现在表有500000条记录,请求速度太慢。我想主要原因是我加入了两张大桌子

我不知道如何优化查询或避免加入这里

有人能帮我吗

PS:若并没有什么需要优化的,我想我需要为计算结果创建一个表,并使用crons时间表

不要选择不需要的字段。MySQL可能足够聪明,可以忽略子查询中的SELECT*,但我不敢打赌。 避免对标准使用函数调用;如果创建的pt_被索引,DATE将使查询忽略索引;如果创建的pt_未编入索引,则应编入索引


DATEc.pt_创建>='2016-10-06'和DATEc.pt_创建的主要原因是连接速度太慢,因为它看起来像是不使用索引。您还应该在此处包含EXPLAIN[your_query]的输出SELECT*不应该与GROUP BY一起使用。想想看。。。返回的列不是聚合的,也不是聚合键。我为pt_添加了索引,创建并附上queryIm每天加入唯一pt_scanid集的解释,然后我将对它们进行计数,并按dayCOUNTDISTINCT pst.pt_scanid分组为uniq-这将在这一天返回唯一pt_scanid,但是我需要对整个表使用完全unqiue pt_scanid。我建议在单独的查询中这样做。
c.pt_created BETWEEN '2016-10-06 00:00:00' AND '2016-12-14 23:59:59'
ON DATE(`c`.`pt_created`)=DATE(`x`.`pt_created`)
SELECT COUNT(DISTINCT `pst`.`pt_created`) AS `count`,
       COUNT(DISTINCT `pst`.`pt_scanid`) AS `uniq`,
       DATE(`c`.`pt_created`) AS theDate
FROM `partners_scanstracking` AS pst
WHERE pst.pt_created BETWEEN '2016-10-06 00:00:00' AND '2016-12-14 23:59:59'
  AND pst.`pt_partner_id` = '0'
GROUP BY theDate
ORDER BY theDate ASC