如何使用索引快速提高 mysql 查询?

Posted

技术标签:

【中文标题】如何使用索引快速提高 mysql 查询?【英文标题】:how to improve mysql query speedy with indexes? 【发布时间】:2020-09-09 14:57:35 【问题描述】:

我必须用 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_2 表有 66469 行,categories 表有 13452 行。

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

你知道加快查询速度的技巧吗?

【问题讨论】:

嗯,加入子字符串肯定会减慢您的查询速度。使用有问题的行创建索引可能会对您有所帮助。 修复糟糕的表格设计,问题就消失了。 (当您不需要该子字符串时。) 很遗憾,我没有权限更改桌子的设计。 虽然我同意桌子设计很差,但我认为修复它并不重要。尽管设计如此,Bill 的索引似乎是最优的。 【参考方案1】:

这是我要尝试的索引:

首先,我需要一个索引,以便您在id_sub_temp 上的 WHERE 条件可以有效地找到所需的行。然后添加列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的join目前是通过主键,已经很高效了。

【讨论】:

以上是关于如何使用索引快速提高 mysql 查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高ElasticSearch 索引速度

mysql提高查询速度

MySQL优化

如何让mysql速度更快的响应?如何提高读取和查询速度

后端接口如何提高性能?从MySQLESHBASE等技术一起探讨下!

170727MySQL查询性能优化