我有一个连接 24 个表(除了 1 个是左外连接)和 83 列的视图。当我从没有 order by 子句的视图中选择 * 时,它会在大约 4:27 秒内返回 27k 行所有列。如果我执行相同的选择但添加了“order by requestId”子句,则需要 83 分钟才能完成。被排序的列在原始表中被索引。
我尝试按 requestId 将它包装在 Select * from (.......) 顺序中,但得到相同的结果。
关于在哪里看的建议
我有一个连接 24 个表(除了 1 个是左外连接)和 83 列的视图。当我从没有 order by 子句的视图中选择 * 时,它会在大约 4:27 秒内返回 27k 行所有列。如果我执行相同的选择但添加了“order by requestId”子句,则需要 83 分钟才能完成。被排序的列在原始表中被索引。
我尝试按 requestId 将它包装在 Select * from (.......) 顺序中,但得到相同的结果。
关于在哪里看的建议
如果您对某列进行排序,则该列必须属于以下任何一项: - 只有该列存在的它自己的索引 - 或者在具有 WHERE 子句中的字段和 ORDER BY 中的字段的索引中子句的确切顺序。
最好告诉我查询。然后我可以和你一起头脑风暴。
如果您有时间浏览它,Explain 可能会告诉您更多信息,但我猜我会说它正在对所有 27,000 行进行完整排序,因为它找不到有用的有序索引来避免额外的排序。
在你所拥有的东西中很难发现,但一个简单的场景是
TableA KeyColumn,DataColumn,其中键列为主键
Select * From TableA Order By KeyColumn
, 将使用有序的 PK 索引,因此不需要排序。
select * From TableA Order By DataColumn
,将读取表格,然后进行排序。
为 Datacolumn 添加一个索引,并且不需要排序。
一旦你遇到更复杂的场景,可能你有一个有用的排序索引,但它不是最好的连接,所以它会快速连接,然后把所有时间都花在排序上。
如果我正在看这个并且该做什么并没有突然出现在我身上,例如。requestid 根本没有索引,然后我会开始从查询中删除表,直到我停止出现不良行为。然后放回去取回它,然后使用这个希望不那么费力的查询,explain
看看我是否可以得到一个有用的索引或重述查询以使用更有用的索引。
祝你好运。