MySQL 视图 - 性能不佳

Posted

技术标签:

【中文标题】MySQL 视图 - 性能不佳【英文标题】:MySQL view - poor performance 【发布时间】:2013-11-07 08:14:13 【问题描述】:

为了便于编码,我将几个表格合并到一个视图中。现在,当我使用该视图加入几个表时,我的性能很差。当我看到更多行时,这些查询的速度显着降低。我使用这个视图写了很多代码,所以我不喜欢重写所有这些查询的解决方案:)。当我将它与其他表连接时,是否有任何优雅的解决方案可以加快该视图的速度?

这是我的一个查询,其中tickets_parsed 是一个视图:

SELECT detailValue, SUM(total_tickets) AS total_tickets, SUM(money_in) AS money_in, SUM(handling_charges) AS handling_charges
FROM (
    SELECT bsid, COUNT(*) AS total_tickets, SUM(amount_total) AS money_in, SUM(handling_charges) AS handling_charges
    FROM `bingo`.tickets_parsed
    WHERE tickettime BETWEEN '$date' AND '$date2a'
    AND ticketstatus <> 'CLOSED'
    GROUP BY bsid
    ORDER BY NULL
) AS sub
NATURAL JOIN betshop_details
WHERE detailID = 5
GROUP BY detailValue
ORDER BY NULL

【问题讨论】:

顺便说一句,虽然我通常讨厌为表名添加前缀(例如 'tbl_users'),但我认为给视图添加前缀是一个非常好的主意(例如 v_tickets_parsed)。这使得在tables 列表中发现views 变得非常容易。 你能发布表声明,以及查询的解释(这样我们就可以看到它选择使用哪些索引)。请注意,自然连接可能有点危险(即,如果有人在表 betshop_details 中添加名为处理充电器的列,将来会发生什么)。 【参考方案1】:

您的查询在子查询中使用视图,这可能会阻止它使用索引。但我不确定子查询是否必要。

你可能会使用这样的东西:-

SELECT a.detailValue, COUNT(*) AS total_tickets, SUM(b.amount_total) AS money_in, SUM(b.handling_charges) AS handling_charges
FROM bingo.tickets_parsed a
INNER JOIN betshop_details b
ON a.bsid = b.bsid
WHERE a.detailID = 5
AND b.tickettime BETWEEN '$date' AND '$date2a'
AND b.ticketstatus <> 'CLOSED'
GROUP BY a.detailValue
ORDER BY NULL

【讨论】:

以上是关于MySQL 视图 - 性能不佳的主要内容,如果未能解决你的问题,请参考以下文章

CTE 中的 SQL Server 视图导致性能不佳

如何纠正 T-SQL 视图中的性能不佳

视图中的 SUM(...) OVER (ORDER BY ...) 导致性能不佳

jQuery 滚动事件 - 检测元素滚动到视图中 - Chrome 上的性能不佳

递归 CTE 性能不佳

iOS UITableViewAutomaticDimension RowHeight 性能不佳/跳跃