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

标签 mysql sql indexing

我想知道索引是否会加快查询速度。我上次检查需要9秒。流量表有大约 30 万行,列表和用户 5 千行。如果这只是一个蹩脚的查询,我也愿意接受 mock /羞辱。我早就写过了。

它应该获得页面浏览量(流量)最多的列表。如果缺少解释,请告诉我。

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 userusername IS NOT NULL


2.traffic_timestamp检查:

      DATEDIFF(NOW(), traffic_timestamp) < 24

使索引难以使用。改成这样可以使用索引
(并且检查我的版本是否相同,我可能有错误):

      traffic_timestamp >= CURRENT_DATE() - INTERVAL 23 DAY

3.COUNT(non-nullable-column)等同于COUNT(*)。更改:

   COUNT(traffic_listingid) AS genuine_hits, 

到:

   COUNT(*) AS genuine_hits, 

因为它在 MySQL 中要快一点(尽管我不确定 4.3 版是否如此)


对于索引问题,您应该在用于连接的每一列上至少有一个索引。为 traffic_timestamp 添加一个可能也有帮助。

如果您告诉我们 traffic_ipaddresstraffic_timestamp 在哪些表中,以及 EXPLAIN EXTENDED 显示什么,有人可能会有更好的主意.

再次阅读查询,似乎它实际上是 GROUP BY 仅在表 traffic 中,其他 2 个表用于获取引用数据。所以,这个查询相当于一个(traffic group by)-join-listing-join-user。不确定这对您的 MySQL 旧版本是否有帮助,但如果一个查询在您的系统中运行得更快,那么同时拥有两个版本的查询和测试可能会更好。

关于mysql - 我应该为这个臃肿的查询添加哪些 SQL 索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7608661/

相关文章:

php - BackboneJS - 如何建立与 MySQL 数据库的连接

mysql - 如果满足其他列值则更新值列

sql - 为什么我的 "INSERT INTO"语句不起作用?

java - JOOQ 检查 Record 对象中的空字段?

indexing - Elasticsearch : How to list each analyzer used by a specific index

mysql - 尝试连接 : ERROR 2003 (HY000): Can't connect to MySQL server on 'google mysql ip here' 时出现 Google CloudSQL (MySQL) 错误

PHP MYSQL LIKE 用于匹配描述中的多个单词

mysql - 如何在不索引更多字段的情况下提高计数性能?

python - 为什么不替换新数据框中的列?

PHP:保持对象分离?