mysql - 如何使用索引快速提高 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_2
66469 行,表categories
有 13452 行。
最有问题的列id_sub_temp
具有以下格式的数据字符串:“2_number”或“3_number”。
你知道一些使查询更快的技巧吗?
解决方案
以下是我会尝试的索引:
首先,我需要一个索引,以便您的 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 的连接目前是通过主键,这已经非常有效了。
推荐阅读
- c - 如何在 C 运行时访问解释器路径地址?
- reactjs - 更新功能组件主体中的状态挂钩设置器
- javascript - 对于 HTML 表单中的 Javascript,尽管有突破性要求,但仍会提交
- python - 为什么 sympy nsolve 给我的值与图形显示的值不同?
- c++ - ++ 前缀运算符重载不适用于 <<
- javascript - 可以将哪些参数传递给 npm-view 命令?
- java - 使用节点时,构造函数节点不能应用于给定类型
- scala - 没有类Scala的依赖注入
- python - 如何在 html django 页面中显示我的 sqlite 查询的结果
- mysql - 表行GoogleSQL中的重复值