如何使用索引快速提高 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 查询?的主要内容,如果未能解决你的问题,请参考以下文章