在我的查询从几秒跳到几小时之前,我体验到了出色的性能。
当在 Mysql 上查询过多数据时,我可以做些什么来 A) 调查 B) 解决主要的性能瓶颈?
也许与内存有关?
结果
在测试存储过程的性能时,我在 5 分钟内运行了两次,首先...
mysql> CALL TopFromBigTable('2012-04-01','2012-05-01',5);
5 rows in set (23.76 sec)
速度非常快,但我再次调用它......我在一个多小时后杀死了它!
mysql> CALL TopFromBigTable('2012-04-01','2012-05-01',5);
---TRANSACTION 1484EF5C, ACTIVE 3571 sec fetching rows, thread declared inside InnoDB 193
mysql tables in use 2, locked 1
MySQL thread id 466174, OS thread handle 0x7f3616ab4700, query id 33098684 localhost root Copying to tmp table
更多测试:
mysql> CALL TopFromBigTable('2012-05-01','2012-05-04',5);
5 rows in set (1.28 sec)
mysql> CALL TopFromBigTable('2012-05-01','2012-05-05',5);
5 rows in set (1.55 sec)
mysql> CALL TopFromBigTable('2012-05-01','2012-05-06',5);
5 rows in set (1 hour 47 min 37.99 sec)
详情
表格
CREATE TABLE `BigTable` (
`BigTableID` int(11) NOT NULL,
`AnotherID` int(11) NOT NULL,
`Type` char(2) COLLATE utf8_unicode_ci DEFAULT NULL,
`StartTime` datetime NOT NULL,
`EndTime` datetime DEFAULT NULL,
PRIMARY KEY (`BigTableID`),
KEY `Type` (`Type`),
KEY `StartTime` (`StartTime`),
KEY `EndTime` (`EndTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
查询(请注意,在制作此泛型时,我的group by
错误)
CREATE PROCEDURE `TopFromBigTable` (
$StartDate DATETIME,
$EndDate DATETIME,
$ResultLimit INT
)
BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT
`Type`,
COUNT(*) AS Count
FROM
`BigTable`
WHERE
`StartTime` > $StartDate
AND
`StartTime` < $EndDate
GROUP BY
`Type`
ORDER BY
Count DESC
LIMIT $ResultLimit
;
COMMIT;
END $$
执行计划
EXPLAIN EXTENDED ...
id: 1
select_type: SIMPLE
table: BigTable
type: range
possible_keys: StartTime
key: StartTime
key_len: 8
ref: NULL
rows: 16446226
filtered: 100.00
Extra: Using where; Using temporary; Using filesort
我在专用报告数据库上运行,因此并非所有常规规则都适用,即我阅读未提交的内容以尝试降低开销,因为准确性不重要并且该数据库在过去 6 小时内未更新。我想对这实际上有多大帮助(如果有的话)进行基准测试,但我无法可靠地为存储过程计时!
最佳答案
这是一个艰难的过程......如果它真的是一个大表 - 在 StartTime 中添加和索引可能需要一些时间和一些额外的空间,但会提高选择速度,前提是根据 http://dev.mysql.com/doc/refman/5.1/en/index-hints.html <指定 USE INDEX
请务必根据每天插入的行数重新编制索引...请自行决定。
在研究您感兴趣的问题时,我也遇到了这个问题:http://www.petefreitag.com/item/613.cfm
关于mysql - 索引查询执行从几秒跳到几小时,数据增加最少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10790768/