【问题标题】:Mysql innodb query returning slow resultMysql innodb 查询返回缓慢的结果
【发布时间】:2016-04-26 14:33:16
【问题描述】:

我有以下查询需要时间。 Mytable 类型是 innodb 并且在字段 tsh_id 上有主键 我还在 transaction_Id 字段上添加了索引

以下是我的数据库存储过程中的实现。

 DECLARE lv_timestamp DATETIME(3);
    SET @lv_timestamp = NOW(3);

    IF(mycondition) then    
        SET @lv_Duration :=( SELECT UNIX_TIMESTAMP (@lv_timestamp)  - UNIX_TIMESTAMP ( `changedon` ) 
        FROM  `MyTable`         
        WHERE transaction_Id = _transaction_Id        
        ORDER BY tsh_id DESC
        LIMIT 1)        
    End if;

请提出任何改进建议

编辑:

解释查询说

"select_type":"SIMPLE",
"table":"MyTable",
"type":"ref",
"possible_keys":"IX_MyTable_Transaction",
"key":"IX_MyTable_Transaction",
"key_len":"98",
"ref":"const",
"rows":1,
"Extra":"Using where"

【问题讨论】:

  • 在查询中运行EXPLAIN 有什么意义?
  • 我已经编辑了我的问题并详细说明了解释的内容
  • 我不能立即从解释中看出查询本身应该很慢。也许其他有更多mysql优化经验的人会有所投入。
  • 请提供更多关于“慢”的含义的信息 - 需要多长时间,您调用了多少次,表中有多少条记录,您希望它多久采取等。另外,transaction_id 是什么数据类型? “解释”输出显示长度为 98,所以很好奇它是如何定义的。
  • 没有@BerndBuffen,唯一有用的索引是(transaction_id, tsh_id)——以=开头,然后添加ORDER BY。 “覆盖指数”会略有改进:(transaction_id, tsh_id, changedon)

标签: mysql sql performance innodb mysql-slow-query-log


【解决方案1】:
  1. 确保您在 MyTable.transaction_Id 上有一个索引
  2. 确保在 MySQL 配置中将 innodb_buffer_pool_size 设置为合适的值

【讨论】:

  • 我在 MyTable.transaction_Id 上有索引,我认为 innodb_buffer_pool_size 设置在 1GB 或 500 MB 左右(我的 mysql 服务器有 4 GB 的 RAM)
【解决方案2】:

我相当确定您的主键不是集群键(它可能为 null 或不是唯一的,或者您曾经更改过它),因为这可以解释这种行为,至少如果 transaction_Id 也不是唯一的(否则你就不需要limit 1)。

要改进此特定查询,您可以创建以下索引:

create index ix_mytable_transaction_id_tsh_id on MyTable (transaction_id, tsh_id desc);

再次使用explain

如果它不使用新密钥,强制它:

SELECT ... FROM  `MyTable` force index(ix_mytable_transaction_id_tsh_id) ...

【讨论】:

  • 这是一个 Mysql innodb 表。 Mysql版本是5.6.27。 tsh_id 是一个自动递增的主键。不知道。我已经尝试过复合索引,但在我的情况下它几乎是多余的,因为我只在 transaction_id 上搜索。 while tsh_id(主键)按子句排序
  • 您能否发布以下结果:show index from MyTable;explain extended <the query>show warnings;(解释扩展后),结果集中的行数SELECT count(*) FROM MyTable WHERE transaction_Id = _transaction_Id,获得该结果所需的时间,以及查询所需的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 2017-07-20
  • 2013-08-24
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多