mysql – 索引但在查询期间仍然很慢
作者:互联网
我有一个存储REST请求和响应的表:
CREATE TABLE ws_call_logs
(
id BIGINT NOT NULL,
ws_method_id BIGINT NOT NULL,
device_id BIGINT,
session_id BIGINT,
corr_id BIGINT,
request MEDIUMBLOB,
response MEDIUMBLOB,
http_status_code INT UNSIGNED NOT NULL,
processing_status CHAR(1) NOT NULL,
created_timestamp DATETIME NOT NULL
)
我创建了4个索引,代表我通常执行的4个查询:
CREATE INDEX ix_corr_id_timstamp ON ws_call_logs (corr_id, created_timestamp);
CREATE INDEX ix_corr_method_timstamp ON ws_call_logs(corr_id, ws_method_id, created_timestamp);
CREATE INDEX ix_corr_id_status_timstamp ON ws_call_logs (corr_id, http_status_code, created_timestamp);
CREATE INDEX ix_corr_method_status_timstamp ON ws_call_logs (corr_id, ws_method_id, http_status_code, created_timestamp);
这是查询:
SELECT *
FROM
ws_call_logs
WHERE
(corr_id is not null
AND http_status_code > 200
AND created_timestamp >= '2015-11-01 23:00:00'
AND created_timestamp <= '2015-11-30 23:00:00'
)
ORDER BY
created_timestamp
DESC LIMIT 25;
我期待它应该很快,因为它应该使用我创建的第三个索引.但它似乎不是,它需要大约1分钟才能返回.
谁能发现问题是什么?或者任何提示如何调试?
任何其他优化查询的技巧将不胜感激.
解决方法:
首先你需要的,检查查询的解释计划:
EXPLAIN SELECT *
FROM
ws_call_logs
WHERE
(corr_id is not null
AND http_status_code > 200
AND created_timestamp >= '2015-11-01 23:00:00'
AND created_timestamp <= '2015-11-30 23:00:00'
)
ORDER BY
created_timestamp
DESC LIMIT 25;
它返回有关运行查询时当前MySQL将使用哪些索引的信息
比你将检查索引的基数
SHOW INDEX FROM ws_call_logs
它给你的想法 – 在这种情况下更好地使用哪个索引
没有关于数据的信息,一般想法:
– created_timestamp的索引 – 好的候选者
您可以或仅为created_timestamp创建索引,或为3列创建索引:
core_id,hit_status_code,created_timestamp – 索引中的列必须与查询中使用的顺序相同
最后SELECT *不提供有关数据大小的想法,即使您请求25条记录,但在服务器必须按DESC排序记录之前
标签:query-performance,mysql,select,index-tuning,index 来源: https://codeday.me/bug/20190806/1597827.html