Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 大型表上的简单mysql查询优化_Php_Mysql_Sql - Fatal编程技术网

Php 大型表上的简单mysql查询优化

Php 大型表上的简单mysql查询优化,php,mysql,sql,Php,Mysql,Sql,我有一个简单的查询,需要2.5秒来计算。我想优化它,但我不知道怎么做。有人能建议如何优化它吗? 逻辑是下一步:统计指定活动中按推荐人分组的所有点击次数。 下面是mysql查询的解释。表和用户有许多行 mysql> explain select count(*) as amount,ac.referrer from clicks ac -> inner join users a on a.id = ac.user_id -> whe

我有一个简单的查询,需要2.5秒来计算。我想优化它,但我不知道怎么做。有人能建议如何优化它吗? 逻辑是下一步:统计指定活动中按推荐人分组的所有点击次数。 下面是mysql查询的解释。表和用户有许多行

mysql> explain select count(*) as amount,ac.referrer from clicks ac
    ->         inner join users a on a.id = ac.user_id
    ->         where a.campaign_id = 26 group by ac.referrer
    ->         order by amount desc;

+----+-------------+-------+--------+-------------------+---------+---------+------------------------+---------+---------------------------------+
| id | select_type | table | type   | possible_keys     | key     | key_len | ref                    | rows    | Extra                           |
+----+-------------+-------+--------+-------------------+---------+---------+------------------------+---------+---------------------------------+
|  1 | SIMPLE      | ac    | ALL    | ac_adv            | NULL    | NULL    | NULL                   | 1607031 | Using temporary; Using filesort |
|  1 | SIMPLE      | a     | eq_ref | PRIMARY,advoc_cam | PRIMARY | 4       | mydb.ac.user_id        |       1 | Using where                     |
+----+-------------+-------+--------+-------------------+---------+---------+------------------------+---------+---------------------------------+
2 rows in set (0.00 sec)
编辑

抱歉,这没有提供shemas,但现在没有必要。现在我有了完整的专栏封面,索引如接受答案中所建议的

这是添加索引c.user\u id,c.referer的正确解决方案。其他索引已经存在,毫无意义。但是现在查询在0.2秒内完成,而不是之前的2.5-3秒。谢谢

mysql> explain select count(*) as amount,ac.referrer from clicks ac
->         inner join users a on a.id = ac.user_id AND a.campaign_id = 26 
->         group by ac.referrer
->         order by amount desc;
更改查询中的位置和。可能会更快

试试看

select count(a.user_id) as amount,ac.referrer 
from users a 
INNER JOIN clicks ac
on a.id = ac.user_id
where a.campaign_id = 26 
group by ac.referrer
order by amount desc;
在users表上有一个键,该键的字段为CAMPAIGN\u ID、user\u ID


->这将在users表上循环,然后为找到的每个用户添加单击

嗯,我可能会将您的查询改写为:

  SELECT c.referrer,
         count(*) amount,
    FROM clicks c
    JOIN users u
      ON u.campaign_id = 26
     AND u.id = c.user_id
GROUP BY c.referrer
ORDER BY amount DESC
只是为了弄清楚到底发生了什么

您的基本查询将达到预期的效果,因此需要索引来提高性能

对于加入用户,u.id上的主键应该很好,但是您可以从u.id上的组合中获得更好的性能

对于主表单击,您应该尝试c.user_id和c.referer上的索引,可能还有两个可能的组合c.user_id、c.referer和c.referer、c.user_id。使用解释计划找出哪些是可能的索引键,并删除那些没有帮助的索引键

如果查询不使用某些索引,但它们显示在可能的_键中,则可能需要提示某些索引。对于每个表或计划的一行,您只能使用一个索引

每个表上都有一个复合索引,其中两个索引覆盖所有四个引用列,例如u.campaign_id、u.id和c.user_id、c.Referer。查询应该由索引覆盖,而不需要访问表行,这将进一步提高性能


还请记住,任何新索引都会降低DML操作的速度—插入、更新、删除包含索引引用的列的位置,因此,如果您具有较高的写入率,则最好使用此查询。

请向我们显示表定义!请给我们看看桌子的结构。试试这个:改变表格点击添加索引引用;我真的不明白。假设您已经在referer、user_id和users.id上有一个复合主键,并且必须已经是PK。因此,唯一剩下的事情就是在campaign_id中添加一个索引,但我怀疑这会有多大的不同-表用户上的复合索引不做任何更改。但点击一下,他们做到了。当然,所有表上都有正确的PK。感谢所有人,寻找可接受的解决方案。这不会有任何影响,乐观主义者会帮你解决这个问题。