mysql - 如何使这个复杂的查询更快[MySQL]?

标签 mysql sql performance

我有下一个查询:

SELECT JL.j_id, COUNT(*) as total
FROM j_log JL
WHERE JL.log_time > '20120205164008'
AND JL.j_id IN (
     SELECT j_id 
     FROM j 
     WHERE checked = '1' 
     AND expires >= '20120207164008'
) GROUP BY JL.j_id ORDER BY total DESC LIMIT 3

j 表有 100 个字段和 248986 行的大结构。

下一个 KEY 存在于其中

  PRIMARY KEY (`j_id`),
  KEY `expires` (`expires`),
  KEY `checked` (`checked`),
  KEY `checked_2` (`checked`,`expires`)

j_log表有大约63000000条记录和下一个结构

CREATE TABLE `j_log` (
  `j_id` int(11) NOT NULL DEFAULT '0',
  `member_id` int(11) DEFAULT NULL,
  `ip` int(10) unsigned NOT NULL DEFAULT '0',
  `log_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  KEY `j_id` (`j_id`),
  KEY `log_time` (`log_time`),
  KEY `ip` (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

所以考虑的查询想要获得访问最多的 j_id 实例的前 3

这是计划

+----+--------------------+-------+-----------------+-----------------------------------+---------+---------+------+----------+----------+----------------------------------------------+
| id | select_type        | table | type            | possible_keys                     | key     | key_len | ref  | rows     | filtered | Extra                                        |
+----+--------------------+-------+-----------------+-----------------------------------+---------+---------+------+----------+----------+----------------------------------------------+
|  1 | PRIMARY            | JL    | index           | log_time                          | j_id    | 4       | NULL | 63914602 |     0.36 | Using where; Using temporary; Using filesort |
|  2 | DEPENDENT SUBQUERY | j     | unique_subquery | PRIMARY,expires,checked,checked_2 | PRIMARY | 4       | func |        1 |   100.00 | Using where                                  |
+----+--------------------+-------+-----------------+-----------------------------------+---------+---------+------+----------+----------+----------------------------------------------+

有时可能会占用 15 个!!!分钟。

有什么方法可以使速度更快吗?

最佳答案

SELECT JL.j_id, COUNT(*) as total
FROM j_log JL
INNER JOIN j
  ON JL.j_id = j.j_id
  AND j.checked = '1'
  AND j.expires >= '20120207164008'
WHERE JL.log_time > '20120205164008'
GROUP BY JL.j_id
ORDER BY total
DESC LIMIT 3

这样会更快吗?

关于mysql - 如何使这个复杂的查询更快[MySQL]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9172161/

相关文章:

c++ - 如何修复 STAMPS 挑战中的 SPOJ 时间限制超出错误?

php - mySQL、PHP、带有可排序列的 HTML 表 - 但某些列值存在问题

mysql - 行之间的差异,直到出现差异行

mysql - 根据查找表搜索并替换超过 500.000 行中的多个单词

sql - 什么更好,动态 SQL 还是 where case?

android - 使用 SQL COUNT 和 SUM 的复杂查询

performance - Hadoop 性能

php - 从另一个表创建下拉列表到我的更新/删除/添加表中

php - 用 PHP 搜索 MySQL 数据库的最佳方法是什么?

php - 在PHP中获取嵌套数组的算法