Django ORM 查询太慢
Django ORM Query Too Slow
我使用这个数据库 table 超过 10000000 条数据。
enter image description here
并使用查询
SELECT mytable.project, COUNT(*) AS `total`
FROM mytable
WHERE (`mytable`.`date` >= '2022-04-05' AND NOT (`mytable`.`user` = 'sw_int'))
GROUP BY `mytable`.`project`
ORDER BY `total`
但是尽管使用了索引,这还是花费了太多时间。 (约 20 秒)
我该如何解决这个问题?
另外,索引如下
enter image description here
这是用 django 制作的。
任何这些可能有助于提高速度。我不知道哪个最好,因为它取决于数据的分布。
INDEX(date, user, project)
INDEX(user, project, date)
INDEX(project, date, user)
每一个都是“覆盖”的,意味着查询可以完全在Index的BTree中进行;这会带来一些性能提升。
由于 date
或 user
上的过滤,前两个中的一个可能会发光。第三种可能避免对 GROUP BY project
进行排序。 (ORDER BY
的排序是不可避免的。)
三个都加; 运行它。还可以执行 EXPLAIN SELECT ...
以查看优化器决定哪个索引可能是最好的。
(以后请使用文字,不要使用图片。)
我使用这个数据库 table 超过 10000000 条数据。 enter image description here
并使用查询
SELECT mytable.project, COUNT(*) AS `total`
FROM mytable
WHERE (`mytable`.`date` >= '2022-04-05' AND NOT (`mytable`.`user` = 'sw_int'))
GROUP BY `mytable`.`project`
ORDER BY `total`
但是尽管使用了索引,这还是花费了太多时间。 (约 20 秒) 我该如何解决这个问题?
另外,索引如下 enter image description here 这是用 django 制作的。
任何这些可能有助于提高速度。我不知道哪个最好,因为它取决于数据的分布。
INDEX(date, user, project)
INDEX(user, project, date)
INDEX(project, date, user)
每一个都是“覆盖”的,意味着查询可以完全在Index的BTree中进行;这会带来一些性能提升。
由于 date
或 user
上的过滤,前两个中的一个可能会发光。第三种可能避免对 GROUP BY project
进行排序。 (ORDER BY
的排序是不可避免的。)
三个都加; 运行它。还可以执行 EXPLAIN SELECT ...
以查看优化器决定哪个索引可能是最好的。
(以后请使用文字,不要使用图片。)