首页 > 解决方案 > 如何使用索引快速提高 mysql 查询?

问题描述

我必须用 MySQL 运行这个查询:

select requests.id, requests.id_temp, categories.id
from opadithree.requests inner join
     opadi.request_detail_2
     on substring(requests.id_sub_temp, 3) = request_detail_2.id inner join 
     opadithree.categories
     on request_detail_2.theme = categories.cu_code
where categories.atc = false and id_sub_temp like "2_%";

但是由于某种原因,查询太慢了。该表requests有 15583 行。表request_detail_266469 行,表categories有 13452 行。

最有问题的列id_sub_temp具有以下格式的数据字符串:“2_number”或“3_number”。

你知道一些使查询更快的技巧吗?

标签: mysqlsqlquery-optimization

解决方案


以下是我会尝试的索引:

首先,我需要一个索引,以便您的 WHERE 条件id_sub_temp可以有效地找到所需的行。然后添加该列id_temp,以便结果可以从索引中选择该列,而不是强制它读取该行。

CREATE INDEX bk1 ON requests (id_sub_temp, id_temp);

接下来,我希望加入类别以进行过滤atc=false,然后匹配cu_code. 我尝试将这些列的顺序颠倒过来cu_code,但这导致了昂贵的索引扫描而不是查找。也许那只是因为我正在使用空表进行测试。无论如何,在这种情况下,我认为列顺序并不重要。

CREATE INDEX bk2 ON categories (atc, cu_code);

request_detail_2 的连接目前是通过主键,这已经非常有效了。


推荐阅读