【发布时间】: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