mysql - 索引查询执行从几秒跳到几小时,数据增加最少

标签 mysql performance stored-procedures indexing innodb

在我的查询从几秒跳到几小时之前,我体验到了出色的性能。

当在 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/

相关文章:

jquery - jquery 和 codeigniter 中的 if else 条件检查和取消选中复选框

java - 使用 hibernate 用数据填充表的正确方法

MYSQL - 解析逗号分隔的数字字符串并将每个数字与设置的数字进行比较

c# - ODP.NET 存储过程和可选参数

mysql - MySQL 有基于时间的触发器吗?

mysql - 插入,如果它已经存在更新列 SQL

c# - System.InvalidCastException : Can't convert VarChar to Int32 at MySqlConnector. Core.Row.GetInt32(Int32序数)

mysql - 喜欢的帖子设计细节

c# - StringBuilder 与串联的性能对比

sql-server - 当 WHERE 子句中只有单个列时,SQL Server 是否会使用复合索引?