mysql - MySQL-define index for select query which has (inner join, CTE and partitions)
问题描述
我的数据库中有 2 个表:subscriptions
和companies
. 应该运行以下查询:
WITH ranked_rows
AS
(
SELECT
s.*
, ROW_NUMBER() OVER (PARTITION BY user_id, company_id ORDER BY insert_timestamp DESC) AS rn
FROM
subscriptions AS s
WHERE
token = 300
AND expire_timestamp>=...
AND expire_timestamp<...
)
SELECT
rr.*
, c.name
, c.activity_plan
FROM
ranked_rows AS rr
INNER JOIN comapnies AS c
ON rr.company_id = c.id
WHERE
rr.rn = 1
AND c.activity_plan = 1
AND c.is_active = true
ORDER BY
c.insert_timestamp;
我定义了以下索引:
subscriptions table:
(token, expire_timestamp)
(insert_timestamp)
(company_id)
companies table:
(id)
(insert_timestamp)
(activity_plan, is_active)
我的问题是这些索引是否足够并针对此查询进行了优化?我应该将另一个复合索引定义为(activity_plan, is_active, insert_timestamp)
?如果查询的最后一行是ORDER BY rr.insert_timestamp
instedORDER BY c.insert_timestamp
怎么办?
解决方案
推荐阅读
- python - 如何覆盖generics.ListCreateAPIView的post方法?
- swift - 当小圆圈消失时,如何重新连接 IBActions?
- java - 如何从 HashSet 中删除元素?
- android - 是否可以通过 adb 调出 Android 键盘?
- python - 拆分后python中的`is`给出了一位数的True和两位数的False
- fortran - WRITE 语句中有太多新行
- java - Maven 编译器插件未将生成的类复制到测试源
- docker - 收集 kubernetes 的 pods 日志
- java - 如何从 kubernetes 上的 jar 文件中启动应用程序源代码
- spring-boot - 如何从 Springboot 中的属性文件中读取它