数据库
首页 > 数据库> > 我应该为这个肿的查询添加哪些SQL索引?

我应该为这个肿的查询添加哪些SQL索引?

作者:互联网

我想知道索引是否可以加快查询速度.我上次检查需要9秒.流量表大约有30万行,列表和用户有5k行.如果这只是一个糟糕的查询,我也很容易受到嘲笑/屈辱.我很久以前写的.

它应该获得具有最多页面浏览量(流量)的列表.让我知道是否缺少解释.

SELECT traffic_listingid AS listing_id, 
       COUNT(traffic_listingid) AS genuine_hits, 
       COUNT(DISTINCT traffic_ipaddress) AS distinct_ips, 
       users.username, 
       listings.listing_address,
       listings.datetime_created,
       DATEDIFF(NOW(), listings.datetime_created) AS listing_age_days 
FROM traffic 
  LEFT JOIN listings 
    ON traffic.traffic_listingid = listings.listing_id 
  LEFT JOIN users 
    ON users.id = listings.seller_id 
WHERE traffic_genuine = 1 
  AND listing_id IS NOT NULL 
  AND username IS NOT NULL 
  AND DATEDIFF(NOW(), traffic_timestamp) < 24 
GROUP BY traffic_listingid 
ORDER BY distinct_ips DESC
LIMIT 10

附言

ENGINE=MyISAM /
MySQL Server 4.3

解决方法:

旁注:

1.你有

  LEFT JOIN listings 
    ON traffic.traffic_listingid = listings.listing_id 
  ...
WHERE ... 
  AND listing_id IS NOT NULL 

此条件将取消LEFT JOIN.将查询更改为:

  INNER JOIN listings 
    ON traffic.traffic_listingid = listings.listing_id 

并从WHERE条件中删除listing_id IS NOT NULL.

同样的情况适用于LEFT JOIN用户和用户名IS NOT NULL.

2,检查traffic_timestamp:

      DATEDIFF(NOW(), traffic_timestamp) < 24

使得索引难以使用.将其更改为可以使用索引的内容
(并检查我的版本是否等效,可能有误):

      traffic_timestamp >= CURRENT_DATE() - INTERVAL 23 DAY

3. COUNT(非空列)等于COUNT(*).更改:

   COUNT(traffic_listingid) AS genuine_hits, 

至:

   COUNT(*) AS genuine_hits, 

因为它在MySQL中速度更快(尽管我不确定版本4.3是否如此)

对于索引问题,用于连接的每个列上至少应有一个索引.为traffic_timestamp再添加一个可能也会有所帮助.

如果您告诉我们traffic_ipaddress和traffic_timestamp在哪些表中,以及EXPLAIN EXTENDED显示的内容,那么可能会有更好的主意.

再次读取查询,似乎实际上只是表流量中的GROUP BY,而其他2个表用于获取参考数据.因此,该查询等效于(流量分组依据)-join-listing-join-user.不确定这对您的MySQL旧版本是否有帮助,但是最好同时使用两个版本的查询并测试一个查询在系统中的运行速度是否更快.

标签:indexing,sql,mysql
来源: https://codeday.me/bug/20191207/2087176.html