数据库
首页 > 数据库> > mysql – 索引但在查询期间仍然很慢

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